﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using DTTB.MV2.QUANLYNHANSUTIENLUONG.Models.FormBean.ChamCongModel;
using DTTB.MV2.QUANLYNHANSUTIENLUONG.Models.LinQ.ChamCong;

namespace DTTB.MV2.QUANLYNHANSUTIENLUONG.BussinessDelegate.ChamCongDelegate
{
    public class ChamCongServiceDelegate
    {
        #region Private Member

        CommonDelegate.CommonDelegate _commonDelegate = new CommonDelegate.CommonDelegate();
        DBChamCongDataContext _dBChamCong = new DBChamCongDataContext();
        int _currentUserId = Convert.ToInt32(HttpContext.Current.Session["USERID"].ToString());

        #endregion

        #region Get

        #region Bảng CC_BangChamCong

        private IQueryable<CC_BangChamCong> QueryGetAllBangChamCong()
        {
            return _dBChamCong.CC_BangChamCongs;
        }

        public IList<CC_BangChamCong> GetAllBangChamCong()
        {
            return QueryGetAllBangChamCong().ToList();
        }

        public CC_BangChamCong GetBangChamCongByIdBangChamCong(int? id)
        {
            try
            {
                return QueryGetAllBangChamCong().Single(p => p.ID == id);
            }
            catch (Exception)
            {
                return null;
            }
        }

        public CC_BangChamCong GetBangChamCongByIdBangChamCong(string id)
        {
            try
            {
                return GetBangChamCongByIdBangChamCong(Convert.ToInt32(id));
            }
            catch (Exception)
            {
                return null;
            }
        }

        /// <summary>
        /// Lấy List Bảng Chấm Công trong Năm
        /// </summary>
        /// <param name="nam">Năm</param>
        /// <returns></returns>
        public IList<CC_BangChamCong> GetListBangChamCongByNam(int? nam)
        {
            return QueryGetAllBangChamCong().Where(p => p.Nam == nam).OrderByDescending(p => p.Thang).ToList();
        }

        /// <summary>
        /// Lấy List Bảng Chấm Công trong Năm
        /// </summary>
        /// <param name="nam">Năm</param>
        /// <returns></returns>
        public IList<CC_BangChamCong> GetListBangChamCongByNam(string nam)
        {
            return GetListBangChamCongByNam(Convert.ToInt16(nam));
        }

        /// <summary>
        /// Lấy Bảng Chấm Công trong Tháng và Năm
        /// </summary>
        /// <param name="thang">Tháng</param>
        /// <param name="nam">Năm</param>
        /// <returns></returns>
        public CC_BangChamCong GetBangChamCongByThangNam(int? thang, int? nam)
        {
            try
            {
                return QueryGetAllBangChamCong().Single(p => p.Nam == nam && p.Thang == thang);
            }
            catch (Exception)
            {
                return null;
            }
        }

        /// <summary>
        /// Lấy Bảng Chấm Công trong Tháng và Năm
        /// </summary>
        /// <param name="thang">Tháng</param>
        /// <param name="nam">Năm</param>
        /// <returns></returns>
        public CC_BangChamCong GetBangChamCongByThangNam(string thang, string nam)
        {
            return GetBangChamCongByThangNam(Convert.ToInt16(nam), Convert.ToInt16(thang));
        }

        /// <summary>
        /// Lấy Bảng Chấm Công của Ngày thực hiện chấm công
        /// </summary>
        /// <param name="ngayChamCong">Ngày thực hiện chấm công</param>
        /// <returns></returns>
        public CC_BangChamCong GetBangChamCongByNgayChamCong(DateTime? ngayChamCong)
        {
            try
            {
                return
                    QueryGetAllBangChamCong()
                        .Single(p => p.Thang == ngayChamCong.Value.Month && p.Nam == ngayChamCong.Value.Year);
            }
            catch (Exception)
            {
                return null;
            }
        }

        /// <summary>
        /// Lấy Bảng Chấm Công của Ngày thực hiện chấm công
        /// </summary>
        /// <param name="ngayChamCong">Ngày thực hiện chấm công</param>
        /// <returns></returns>
        public CC_BangChamCong GetBangChamCongByNgayChamCong(string ngayChamCong)
        {
            try
            {
                DateTime? dtNgayChamCong = _commonDelegate.ConvertStringToDateTime(ngayChamCong);
                return
                    QueryGetAllBangChamCong()
                        .Single(p => p.Thang == dtNgayChamCong.Value.Month && p.Nam == dtNgayChamCong.Value.Year);
            }
            catch (Exception)
            {
                return null;
            }
        }

        /// <summary>
        /// Lấy Mã Bảng Chấm Công của Tháng và Năm
        /// </summary>
        /// <param name="thang">Tháng</param>
        /// <param name="nam">Năm</param>
        /// <returns></returns>
        public int GetIdBangChamCongByThangNam(int? thang, int? nam)
        {
            try
            {
                return GetBangChamCongByThangNam(thang, nam).ID;
            }
            catch (Exception)
            {
                return 0;
            }
        }

        /// <summary>
        /// Lấy danh sách năm tồn tại trong Bảng Chấm Công
        /// </summary>
        /// <returns></returns>
        public IList<int> GetAllNamTrongBangChamCong()
        {
            return QueryGetAllBangChamCong().Select(p => Convert.ToInt32(p.Nam)).Distinct().OrderByDescending(p => p).ToList();
        }

        /// <summary>
        /// Lấy danh sách tháng trong năm đã tồn tại trong Bảng Chấm Công
        /// </summary>
        /// <returns></returns>
        public IList<int> GetAllThangTrongNamTrongBangChamCong(int nam)
        {
            return
                QueryGetAllBangChamCong().Where(p => p.Nam == nam).Select(p => Convert.ToInt32(p.Thang)).Distinct().
                    OrderBy(p => p).ToList();
        }

        /// <summary>
        /// Lấy danh sách Tháng chưa có bảng chấm công trong Năm
        /// </summary>
        /// <returns></returns>
        public IList<int> GetThangChuaCoBangChamCongTrongNam(int nam)
        {
            //Các tháng đã có trong database
            var listThangDaTonTai = GetAllThangTrongNamTrongBangChamCong(nam);
            //Các tháng chưa có bảng chấm công
            var result = _commonDelegate.GetThangKhongTonTaiTrongDanhSachChoTruoc(listThangDaTonTai);

            return result;
        }

        /// <summary>
        /// Kiểm tra thông tin Bảng Chấm Công có tồn tại trong CSDL không
        /// </summary>
        /// <param name="idBangChamCong">Id Bảng Chấm Công</param>
        /// <returns></returns>
        public bool IsExistsBangChamCongByIdBangChamCong(int? idBangChamCong)
        {
            return GetBangChamCongByIdBangChamCong(idBangChamCong) != null;
        }

        /// <summary>
        /// Kiểm tra thông tin Bảng Chấm Công có tồn tại trong CSDL không
        /// </summary>
        /// <param name="idBangChamCong">Id Bảng Chấm Công</param>
        /// <returns></returns>
        public bool IsExistsBangChamCongByIdBangChamCong(string idBangChamCong)
        {
            return GetBangChamCongByIdBangChamCong(idBangChamCong) != null;
        }

        /// <summary>
        /// Kiểm tra thông tin Bảng Chấm Công trong Tháng và Năm có tồn tại trong CSDL không
        /// </summary>
        /// <param name="thang">Tháng</param>
        /// <param name="nam">Năm</param>
        /// <returns></returns>
        public bool IsExistsBangChamCong(int? thang, int? nam)
        {
            return GetBangChamCongByThangNam(thang, nam) != null;
        }

        /// <summary>
        /// Kiểm tra thông tin Bảng Chấm Công trong Tháng và Năm có tồn tại trong CSDL không
        /// </summary>
        /// <param name="thang">Tháng</param>
        /// <param name="nam">Năm</param>
        /// <returns></returns>
        public bool IsExistsBangChamCong(string thang, string nam)
        {
            return GetBangChamCongByThangNam(thang, nam) != null;
        }

        /// <summary>
        /// Kiểm tra thông tin Bảng Chấm Công của Ngày thực hiện chấm công có tồn tại trong CSDL không
        /// </summary>
        /// <param name="ngayChamCong">Ngày thực hiện chấm công</param>
        /// <returns></returns>
        public bool IsExistsBangChamCong(DateTime? ngayChamCong)
        {
            return GetBangChamCongByNgayChamCong(ngayChamCong) != null;
        }

        /// <summary>
        /// Kiểm tra thông tin Bảng Chấm Công của Ngày thực hiện chấm công có tồn tại trong CSDL không
        /// </summary>
        /// <param name="ngayChamCong">Ngày thực hiện chấm công</param>
        /// <returns></returns>
        public bool IsExistsBangChamCong(string ngayChamCong)
        {
            return GetBangChamCongByNgayChamCong(ngayChamCong) != null;
        }

        /// <summary>
        /// Kiểm tra xem Bảng Chấm Công có được phép chỉnh sửa không?
        /// </summary>
        /// <param name="objBangChamCong"></param>
        /// <returns></returns>
        public bool IsDuocPhepChinhSuaBangChamCong(CC_BangChamCong objBangChamCong)
        {
            try
            {
                if (objBangChamCong.IsFinish == false && objBangChamCong.IsLock == false)
                {
                    return true;
                }
                return false;
            }
            catch (Exception)
            {
                return false;
            }
        }

        /// <summary>
        /// Kiểm tra xem Bảng Chấm Công có được phép chỉnh sửa không?
        /// </summary>
        /// <param name="idBangChamCong">Id Bảng Chấm Công</param>
        /// <returns></returns>
        public bool IsDuocPhepChinhSuaBangChamCongByIdBangChamCong(int? idBangChamCong)
        {
            return IsDuocPhepChinhSuaBangChamCong(GetBangChamCongByIdBangChamCong(idBangChamCong));
        }

        /// <summary>
        /// Kiểm tra xem Bảng Chấm Công có được phép chỉnh sửa không?
        /// </summary>
        /// <param name="idBangChamCong">Id Bảng Chấm Công</param>
        /// <returns></returns>
        public bool IsDuocPhepChinhSuaBangChamCongByIdBangChamCong(string idBangChamCong)
        {
            return IsDuocPhepChinhSuaBangChamCong(GetBangChamCongByIdBangChamCong(idBangChamCong));
        }

        /// <summary>
        /// Kiểm tra xem Bảng Chấm Công có được phép chỉnh sửa không?
        /// </summary>
        /// <param name="thang">Tháng</param>
        /// <param name="nam">Năm</param>
        /// <returns></returns>
        public bool IsDuocPhepChinhSuaBangChamCong(int? thang, int? nam)
        {
            return IsDuocPhepChinhSuaBangChamCong(GetBangChamCongByThangNam(thang, nam));
        }

        /// <summary>
        /// Kiểm tra xem Bảng Chấm Công có được phép chỉnh sửa không?
        /// </summary>
        /// <param name="thang">Tháng</param>
        /// <param name="nam">Năm</param>
        /// <returns></returns>
        public bool IsDuocPhepChinhSuaBangChamCong(string thang, string nam)
        {
            return IsDuocPhepChinhSuaBangChamCong(GetBangChamCongByThangNam(thang, nam));
        }

        /// <summary>
        /// Kiểm tra xem Bảng Chấm Công có được phép chỉnh sửa không?
        /// </summary>
        /// <param name="ngayChamCong">Ngày thực hiện chấm công</param>
        /// <returns></returns>
        public bool IsDuocPhepChinhSuaBangChamCong(DateTime? ngayChamCong)
        {
            return IsDuocPhepChinhSuaBangChamCong(GetBangChamCongByNgayChamCong(ngayChamCong));
        }

        /// <summary>
        /// Kiểm tra xem Bảng Chấm Công có được phép chỉnh sửa không?
        /// </summary>
        /// <param name="ngayChamCong">Ngày thực hiện chấm công</param>
        /// <returns></returns>
        public bool IsDuocPhepChinhSuaBangChamCong(string ngayChamCong)
        {
            return IsDuocPhepChinhSuaBangChamCong(GetBangChamCongByNgayChamCong(ngayChamCong));
        }

        #endregion

        #region Bảng CC_ChamCongNgayNhanVien

        private IQueryable<CC_ChamCongNgayNhanVien> QueryGetAllChamCongNgayNhanVien()
        {
            return _dBChamCong.CC_ChamCongNgayNhanViens;
        }

        public IList<CC_ChamCongNgayNhanVien> GetAllChamCongNgayNhanVien()
        {
            return QueryGetAllChamCongNgayNhanVien().ToList();
        }

        public IList<CC_ChamCongNgayNhanVien> GetListChamCongNgayNhanVienByIdBangChamCong(int? idBangChamCong)
        {
            return QueryGetAllChamCongNgayNhanVien().Where(p => p.MaBangChamCong == idBangChamCong).ToList();
        }

        public IList<CC_ChamCongNgayNhanVien> GetListChamCongNgayNhanVienByIdBangChamCong(string idBangChamCong)
        {
            return GetListChamCongNgayNhanVienByIdBangChamCong(Convert.ToInt32(idBangChamCong));
        }

        public IList<CC_ChamCongNgayNhanVien> GetListChamCongNgayNhanVienByIdNhanVien(int? idNhanVien)
        {
            return QueryGetAllChamCongNgayNhanVien().Where(p => p.MaNhanVien == idNhanVien).ToList();
        }

        public IList<CC_ChamCongNgayNhanVien> GetListChamCongNgayNhanVienByIdNhanVien(string idNhanVien)
        {
            return GetListChamCongNgayNhanVienByIdNhanVien(Convert.ToInt32(idNhanVien));
        }

        public IList<CC_ChamCongNgayNhanVien> GetListChamCongNgayNhanVienByIdBangChamCongOrderByTen(int? idBangChamCong, int pageIndex, int itemPerPage, ref int totalItem, ref int totalPage)
        {
            try
            {
                pageIndex = pageIndex > 1 ? pageIndex : 1;
                totalItem = 0;
                totalPage = 0;
                var query = from ccong in QueryGetAllChamCongNgayNhanVien().Where(p => p.MaBangChamCong == idBangChamCong)
                            join nvien in _dBChamCong.hs_NhanViens on ccong.MaNhanVien equals nvien.Id
                            into t
                            from nviennew in t.DefaultIfEmpty()
                            orderby nviennew.Ten.Trim()
                            select ccong;

                totalItem = query.Count();
                if (itemPerPage > 0)
                {
                    if (totalItem % itemPerPage == 0)
                        totalPage = totalItem / itemPerPage;
                    else
                        totalPage = (totalItem / itemPerPage) + 1;

                    return query.Skip((pageIndex - 1) * itemPerPage).Take(itemPerPage).ToList(); 
                }
                totalPage = totalItem > 0 ? 1 : 0;
                return query.ToList();
            }
            catch (Exception)
            {
                return new List<CC_ChamCongNgayNhanVien>();
            }
        }

        public IList<CC_ChamCongNgayNhanVien> GetListChamCongNgayNhanVienByIdBangChamCongOrderByTen(string idBangChamCong, int pageIndex, int itemPerPage, ref int totalItem, ref int totalPage)
        {
            return GetListChamCongNgayNhanVienByIdBangChamCongOrderByTen(Convert.ToInt32(idBangChamCong), pageIndex, itemPerPage, ref  totalItem, ref totalPage);
        }

        public IList<CC_ChamCongNgayNhanVien> SearchChamCongNgayNhanVienByIdBangChamCongOrderByTen(int? idBangChamCong, int? idPhongBan, int? idChucVu, string hoTen, int pageIndex, int itemPerPage, ref int totalItem, ref int totalPage)
        {
            try
            {
                hoTen = !string.IsNullOrEmpty(hoTen) ? hoTen.Trim() : string.Empty;
                pageIndex = pageIndex > 1 ? pageIndex : 1;
                totalItem = 0;
                totalPage = 0;

                if (idPhongBan > 0 && idChucVu > 0)
                {
                    #region Tìm theo Phòng Ban && Chức Vụ
                    if (!string.IsNullOrEmpty(hoTen))
                    {
                        var query = from ccong in QueryGetAllChamCongNgayNhanVien().Where(p => p.MaBangChamCong == idBangChamCong)
                                    join nvien in _dBChamCong.hs_NhanViens on ccong.MaNhanVien equals nvien.Id
                                    into t
                                    from nviennew in t.DefaultIfEmpty()
                                    where
                                        nviennew.IdPhongBan == idPhongBan
                                        && nviennew.IdChucVu == idChucVu
                                        && ((nviennew.Ho.Trim() + " " + nviennew.Ten.Trim()).Contains(hoTen) || nviennew.SoThe.Contains(hoTen))
                                    orderby nviennew.Ten.Trim()
                                    select ccong;

                        totalItem = query.Count();
                        if (itemPerPage > 0)
                        {
                            if (totalItem % itemPerPage == 0)
                                totalPage = totalItem / itemPerPage;
                            else
                                totalPage = (totalItem / itemPerPage) + 1;

                            return query.Skip((pageIndex - 1) * itemPerPage).Take(itemPerPage).ToList();
                        }
                        totalPage = totalItem > 0 ? 1 : 0;
                        return query.ToList();
                    }
                    else
                    {
                        var query = from ccong in QueryGetAllChamCongNgayNhanVien().Where(p => p.MaBangChamCong == idBangChamCong)
                                    join nvien in _dBChamCong.hs_NhanViens on ccong.MaNhanVien equals nvien.Id
                                    into t
                                    from nviennew in t.DefaultIfEmpty()
                                    where
                                        nviennew.IdPhongBan == idPhongBan
                                        && nviennew.IdChucVu == idChucVu
                                    orderby nviennew.Ten.Trim()
                                    select ccong;

                        totalItem = query.Count();
                        if (itemPerPage > 0)
                        {
                            if (totalItem % itemPerPage == 0)
                                totalPage = totalItem / itemPerPage;
                            else
                                totalPage = (totalItem / itemPerPage) + 1;

                            return query.Skip((pageIndex - 1) * itemPerPage).Take(itemPerPage).ToList();
                        }
                        totalPage = totalItem > 0 ? 1 : 0;
                        return query.ToList();
                    }
                    #endregion
                }
                if (idPhongBan > 0)
                {
                    #region Tìm theo Phòng Ban
                    if (!string.IsNullOrEmpty(hoTen))
                    {
                        var query = from ccong in QueryGetAllChamCongNgayNhanVien().Where(p => p.MaBangChamCong == idBangChamCong)
                                    join nvien in _dBChamCong.hs_NhanViens on ccong.MaNhanVien equals nvien.Id
                                    into t
                                    from nviennew in t.DefaultIfEmpty()
                                    where
                                        nviennew.IdPhongBan == idPhongBan
                                        && ((nviennew.Ho.Trim() + " " + nviennew.Ten.Trim()).Contains(hoTen) || nviennew.SoThe.Contains(hoTen))
                                    orderby nviennew.Ten.Trim()
                                    select ccong;

                        totalItem = query.Count();
                        if (itemPerPage > 0)
                        {
                            if (totalItem % itemPerPage == 0)
                                totalPage = totalItem / itemPerPage;
                            else
                                totalPage = (totalItem / itemPerPage) + 1;

                            return query.Skip((pageIndex - 1) * itemPerPage).Take(itemPerPage).ToList();
                        }
                        totalPage = totalItem > 0 ? 1 : 0;
                        return query.ToList();
                    }
                    else
                    {
                        var query = from ccong in QueryGetAllChamCongNgayNhanVien().Where(p => p.MaBangChamCong == idBangChamCong)
                                    join nvien in _dBChamCong.hs_NhanViens on ccong.MaNhanVien equals nvien.Id
                                    into t
                                    from nviennew in t.DefaultIfEmpty()
                                    where
                                        nviennew.IdPhongBan == idPhongBan
                                    orderby nviennew.Ten.Trim()
                                    select ccong;

                        totalItem = query.Count();
                        if (itemPerPage > 0)
                        {
                            if (totalItem % itemPerPage == 0)
                                totalPage = totalItem / itemPerPage;
                            else
                                totalPage = (totalItem / itemPerPage) + 1;

                            return query.Skip((pageIndex - 1) * itemPerPage).Take(itemPerPage).ToList();
                        }
                        totalPage = totalItem > 0 ? 1 : 0;
                        return query.ToList();
                    }
                    #endregion
                }
                if (idChucVu > 0)
                {
                    #region Tìm theo Chức Vụ
                    if (!string.IsNullOrEmpty(hoTen))
                    {
                        var query = from ccong in QueryGetAllChamCongNgayNhanVien().Where(p => p.MaBangChamCong == idBangChamCong)
                                    join nvien in _dBChamCong.hs_NhanViens on ccong.MaNhanVien equals nvien.Id
                                    into t
                                    from nviennew in t.DefaultIfEmpty()
                                    where
                                        nviennew.IdChucVu == idChucVu
                                        && ((nviennew.Ho.Trim() + " " + nviennew.Ten.Trim()).Contains(hoTen) || nviennew.SoThe.Contains(hoTen))
                                    orderby nviennew.Ten.Trim()
                                    select ccong;

                        totalItem = query.Count();
                        if (itemPerPage > 0)
                        {
                            if (totalItem % itemPerPage == 0)
                                totalPage = totalItem / itemPerPage;
                            else
                                totalPage = (totalItem / itemPerPage) + 1;

                            return query.Skip((pageIndex - 1) * itemPerPage).Take(itemPerPage).ToList();
                        }
                        totalPage = totalItem > 0 ? 1 : 0;
                        return query.ToList();
                    }
                    else
                    {
                        var query = from ccong in QueryGetAllChamCongNgayNhanVien().Where(p => p.MaBangChamCong == idBangChamCong)
                                    join nvien in _dBChamCong.hs_NhanViens on ccong.MaNhanVien equals nvien.Id
                                    into t
                                    from nviennew in t.DefaultIfEmpty()
                                    where
                                        nviennew.IdChucVu == idChucVu
                                    orderby nviennew.Ten.Trim()
                                    select ccong;

                        totalItem = query.Count();
                        if (itemPerPage > 0)
                        {
                            if (totalItem % itemPerPage == 0)
                                totalPage = totalItem / itemPerPage;
                            else
                                totalPage = (totalItem / itemPerPage) + 1;

                            return query.Skip((pageIndex - 1) * itemPerPage).Take(itemPerPage).ToList();
                        }
                        totalPage = totalItem > 0 ? 1 : 0;
                        return query.ToList();
                    }
                    #endregion
                }

                if (!string.IsNullOrEmpty(hoTen))
                {
                    var query = from ccong in QueryGetAllChamCongNgayNhanVien().Where(p => p.MaBangChamCong == idBangChamCong)
                                join nvien in _dBChamCong.hs_NhanViens on ccong.MaNhanVien equals nvien.Id
                                into t
                                from nviennew in t.DefaultIfEmpty()
                                where
                                    ((nviennew.Ho.Trim() + " " + nviennew.Ten.Trim()).Contains(hoTen) || nviennew.SoThe.Contains(hoTen))
                                orderby nviennew.Ten.Trim()
                                select ccong;

                    totalItem = query.Count();
                    if (itemPerPage > 0)
                    {
                        if (totalItem % itemPerPage == 0)
                            totalPage = totalItem / itemPerPage;
                        else
                            totalPage = (totalItem / itemPerPage) + 1;

                        return query.Skip((pageIndex - 1) * itemPerPage).Take(itemPerPage).ToList();
                    }
                    totalPage = totalItem > 0 ? 1 : 0;
                    return query.ToList();
                }
                else
                {
                    var query = from ccong in QueryGetAllChamCongNgayNhanVien().Where(p => p.MaBangChamCong == idBangChamCong)
                                join nvien in _dBChamCong.hs_NhanViens on ccong.MaNhanVien equals nvien.Id
                                into t
                                from nviennew in t.DefaultIfEmpty()
                                orderby nviennew.Ten.Trim()
                                select ccong;

                    totalItem = query.Count();
                    if (itemPerPage > 0)
                    {
                        if (totalItem % itemPerPage == 0)
                            totalPage = totalItem / itemPerPage;
                        else
                            totalPage = (totalItem / itemPerPage) + 1;

                        return query.Skip((pageIndex - 1) * itemPerPage).Take(itemPerPage).ToList();
                    }
                    totalPage = totalItem > 0 ? 1 : 0;
                    return query.ToList();
                }
            }
            catch (Exception)
            {
                return new List<CC_ChamCongNgayNhanVien>();
            }
        }

        public CC_ChamCongNgayNhanVien GetChamCongNgayNhanVienByIdBangChamCongVaIdNhanVien(int? idBangChamCong, int? idNhanVien)
        {
            try
            {
                return
                    QueryGetAllChamCongNgayNhanVien()
                        .Single(p => p.MaBangChamCong == idBangChamCong && p.MaNhanVien == idNhanVien);
            }
            catch (Exception)
            {
                return null;
            }
        }

        public CC_ChamCongNgayNhanVien GetChamCongNgayNhanVienByIdBangChamCongVaIdNhanVien(string idBangChamCong, string idNhanVien)
        {
            return GetChamCongNgayNhanVienByIdBangChamCongVaIdNhanVien(Convert.ToInt32(idBangChamCong), Convert.ToInt32(idNhanVien));
        }

        public CC_ChamCongNgayNhanVien GetChamCongNgayNhanVienByThangNamVaIdNhanVien(int thang, int nam, int idNhanVien)
        {
            try
            {
                return
                    QueryGetAllChamCongNgayNhanVien()
                        .Single(
                            p =>
                            p.MaBangChamCong == this.GetBangChamCongByThangNam(thang, nam).ID &&
                            p.MaNhanVien == idNhanVien);
            }
            catch (Exception)
            {
                return null;
            }
        }

        /// <summary>
        /// Lấy danh sách chứa tất cả Mã Nhân Viên có trong bảng Chấm Công Ngày
        /// </summary>
        /// <param name="idBangChamCong">Mã Bảng Chấm Công</param>
        /// <returns></returns>
        public IList<int> GetAllMaNhanVienTrongChamCongNgayByIdBangChamCong(int? idBangChamCong)
        {
            return
                QueryGetAllChamCongNgayNhanVien().Where(p => p.MaBangChamCong == idBangChamCong).Select(
                    p => p.MaNhanVien).ToList();
        }

        /// <summary>
        /// Lấy danh sách chứa tất cả Mã Nhân Viên có trong bảng Chấm Công Ngày
        /// </summary>
        /// <param name="thang">Tháng Bảng Chấm Công</param>
        /// <param name="nam">Năm Bảng Chấm Công</param>
        /// <returns></returns>
        public IList<int> GetAllMaNhanVienTrongChamCongNgayByThangNam(int? thang, int? nam)
        {
            var idBangChamCong = 0;
            idBangChamCong = GetIdBangChamCongByThangNam(thang, nam);
            return
                GetAllMaNhanVienTrongChamCongNgayByIdBangChamCong(idBangChamCong);
        }

        /// <summary>
        /// Lấy danh sách chứa tất cả Mã Nhân Viên có trong bảng Chấm Công Ngày (Sắp xếp tăng dần theo tên)
        /// </summary>
        /// <param name="idBangChamCong">Mã Bảng Chấm Công</param>
        /// <returns></returns>
        public IList<int> GetAllMaNhanVienTrongChamCongNgayByIdBangChamCongOrderByTen(int? idBangChamCong)
        {
            return (from ccong in QueryGetAllChamCongNgayNhanVien().Where(p => p.MaBangChamCong == idBangChamCong)
                    join nvien in _dBChamCong.hs_NhanViens on ccong.MaNhanVien equals nvien.Id
                    into t
                    from nviennew in t.DefaultIfEmpty()
                    orderby nviennew.Ten.Trim()
                    select ccong.MaNhanVien).ToList();
        }

        /// <summary>
        /// Lấy danh sách chứa tất cả Mã Nhân Viên có trong bảng Chấm Công Ngày (Sắp xếp tăng dần theo tên)
        /// </summary>
        /// <param name="thang">Tháng Bảng Chấm Công</param>
        /// <param name="nam">Năm Bảng Chấm Công</param>
        /// <returns></returns>
        public IList<int> GetAllMaNhanVienTrongChamCongNgayByThangNamOrderByTen(int? thang, int? nam)
        {
            var idBangChamCong = 0;
            idBangChamCong = GetIdBangChamCongByThangNam(thang, nam);
            return
                GetAllMaNhanVienTrongChamCongNgayByIdBangChamCongOrderByTen(idBangChamCong);
        }

        public bool IsExistsChamCongNgayNhanVien(int? idBangChamCong, int? idNhanVien)
        {
            return GetChamCongNgayNhanVienByIdBangChamCongVaIdNhanVien(idBangChamCong, idNhanVien) != null;
        }

        /// <summary>
        /// Query Tìm Kiếm Nhân Viên Trong Bảng Chấm Công Ngày
        /// </summary>
        /// <param name="lstMaNhanVienTrongBangChamCong">Danh Sách Nhân Viên có trong Bảng Chấm Công Ngày</param>
        /// <param name="dieuKienTim"></param>
        /// <param name="giaTriCanTim"></param>
        /// <returns></returns>
        public IQueryable<hs_NhanVien> QueryGetSearchNhanVienTrongChamCongNgay(List<int> lstMaNhanVienTrongBangChamCong, string dieuKienTim, string giaTriCanTim)
        {
            giaTriCanTim = !string.IsNullOrEmpty(giaTriCanTim) ? giaTriCanTim.Trim() : string.Empty;

            if (string.IsNullOrEmpty(giaTriCanTim))
            {
                return QueryGetAllNhanVien().Where(p => lstMaNhanVienTrongBangChamCong.Contains(p.Id));
            }
            if (string.IsNullOrEmpty(dieuKienTim) || dieuKienTim.ToLower() == "hoten")
            {
                //Tìm theo họ tên
                return
                    QueryGetAllNhanVien().Where(
                        p =>
                        lstMaNhanVienTrongBangChamCong.Contains(p.Id) &&
                        (p.Ho.Trim() + " " + p.Ten.Trim()).Contains(giaTriCanTim));
                ////Tìm theo họ tên
                //return
                //    QueryGetAllNhanVien().Where(
                //        p => lstMaNhanVienTrongBangChamCong.Contains(p.Id) && p.Ho.Contains(giaTriCanTim));
            }
            if (dieuKienTim.ToLower() == "sothe")
            {
                //Tìm theo số thẻ
                return
                    QueryGetAllNhanVien().Where(
                        p => lstMaNhanVienTrongBangChamCong.Contains(p.Id) && p.SoThe.Contains(giaTriCanTim));
            }
            //Tìm theo Ngày sinh
            var qrTimTheoNgay = QueryGetAllNhanVien().Where(
                p => lstMaNhanVienTrongBangChamCong.Contains(p.Id));

            var ngay = 0;
            var thang = 0;
            var nam = 0;
            try
            {
                ngay = int.Parse(giaTriCanTim.Split('/').First());
                thang = int.Parse(giaTriCanTim.Split('/').ElementAt(1));
                nam = int.Parse(giaTriCanTim.Split('/').Last());
            }
            catch (Exception)
            {
                return qrTimTheoNgay.Where(p => p.NamSinh.Value.Day == 32);
            }


            if (ngay > 0) qrTimTheoNgay = qrTimTheoNgay.Where(p => p.NamSinh.Value.Day == ngay);
            if (thang > 0) qrTimTheoNgay = qrTimTheoNgay.Where(p => p.NamSinh.Value.Month == thang);
            if (nam > 0) qrTimTheoNgay = qrTimTheoNgay.Where(p => p.NamSinh.Value.Year == nam);
            return qrTimTheoNgay;
        }

        #region Các hàm tổng hợp dữ liệu chấm công

        /// <summary>
        /// Lấy Ký Hiệu Chấm Công Của Một Nhân Viên trong Một Bảng Chấm Công theo ngày
        /// </summary>
        /// <param name="objChamCongNgay">Dòng dữ liệu Chấm Công một tháng của Một Nhân Viên</param>
        /// <param name="ngay">Ngày cần lấy Ký Hiệu Chấm Công trong tháng</param>
        /// <returns></returns>
        public string GetKyHieuChamCongNgayByChamCongNgayVaNgay(CC_ChamCongNgayNhanVien objChamCongNgay, int ngay)
        {
            if (!(ngay >= 0 && ngay <= 31))
            {
                return "KTT"; //Không tồn tại ngày tháng
            }
            string result;
            switch (ngay)
            {
                case 1:
                    result = objChamCongNgay.N1;
                    break;
                case 2:
                    result = objChamCongNgay.N2;
                    break;
                case 3:
                    result = objChamCongNgay.N3;
                    break;
                case 4:
                    result = objChamCongNgay.N4;
                    break;
                case 5:
                    result = objChamCongNgay.N5;
                    break;
                case 6:
                    result = objChamCongNgay.N6;
                    break;
                case 7:
                    result = objChamCongNgay.N7;
                    break;
                case 8:
                    result = objChamCongNgay.N8;
                    break;
                case 9:
                    result = objChamCongNgay.N9;
                    break;
                case 10:
                    result = objChamCongNgay.N10;
                    break;
                case 11:
                    result = objChamCongNgay.N11;
                    break;
                case 12:
                    result = objChamCongNgay.N12;
                    break;
                case 13:
                    result = objChamCongNgay.N13;
                    break;
                case 14:
                    result = objChamCongNgay.N14;
                    break;
                case 15:
                    result = objChamCongNgay.N15;
                    break;
                case 16:
                    result = objChamCongNgay.N16;
                    break;
                case 17:
                    result = objChamCongNgay.N17;
                    break;
                case 18:
                    result = objChamCongNgay.N18;
                    break;
                case 19:
                    result = objChamCongNgay.N19;
                    break;
                case 20:
                    result = objChamCongNgay.N20;
                    break;
                case 21:
                    result = objChamCongNgay.N21;
                    break;
                case 22:
                    result = objChamCongNgay.N22;
                    break;
                case 23:
                    result = objChamCongNgay.N23;
                    break;
                case 24:
                    result = objChamCongNgay.N24;
                    break;
                case 25:
                    result = objChamCongNgay.N25;
                    break;
                case 26:
                    result = objChamCongNgay.N26;
                    break;
                case 27:
                    result = objChamCongNgay.N27;
                    break;
                case 28:
                    result = objChamCongNgay.N28;
                    break;
                case 29:
                    result = objChamCongNgay.N29;
                    break;
                case 30:
                    result = objChamCongNgay.N30;
                    break;
                default:
                    result = objChamCongNgay.N31;
                    break;
            }
            return result;
        }

        /// <summary>
        /// Lấy Ký Hiệu Chấm Công Của Một Nhân Viên trong Một Bảng Chấm Công theo ngày
        /// </summary>
        /// <param name="idBangChamCong">Mã Bảng Chấm Công</param>
        /// <param name="idNhanVien">Mã Nhân Viên</param>
        /// <param name="ngay">Ngày cần lấy Ký Hiệu Chấm Công trong tháng</param>
        /// <returns></returns>
        public string GetKyHieuChamCongNgayByIdBangChamCongVaIdNhanVienVaNgay(int idBangChamCong, int idNhanVien, int ngay)
        {
            var objChamCongNgay = GetChamCongNgayNhanVienByIdBangChamCongVaIdNhanVien(idBangChamCong, idNhanVien);
            return GetKyHieuChamCongNgayByChamCongNgayVaNgay(objChamCongNgay, ngay);
        }

        /// <summary>
        /// Lấy Ký Hiệu Chấm Công Của Một Nhân Viên theo Ngày Tháng Năm đã chấm công
        /// </summary>
        /// <param name="idNhanVien">Mã Nhân Viên</param>
        /// <param name="ngay">Ngày</param>
        /// <param name="thang">Tháng</param>
        /// <param name="nam">Năm</param>
        /// <returns></returns>
        public string GetKyHieuChamCongNgayByIdNhanVienVaNgayThangNam(int idNhanVien, int ngay, int thang, int nam)
        {
            var objChamCongNgay = GetChamCongNgayNhanVienByThangNamVaIdNhanVien(thang, nam, idNhanVien);
            return GetKyHieuChamCongNgayByChamCongNgayVaNgay(objChamCongNgay, ngay);
        }

        /// <summary>
        /// Đếm tổng số lần xuất hiện của một Ký Hiệu Chấm Công của Một Nhân Viên trong Một Tháng
        /// </summary>
        /// <param name="objChamCongNgay">Bảng Dữ liệu Chấm Công của Một Nhân Viên trong Một Tháng</param>
        /// <param name="kyHieuChamCong">Mã Ký Hiệu Lấy bên bảng CC_KyHieuChamCong</param>
        /// <returns></returns>
        public int CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(CC_ChamCongNgayNhanVien objChamCongNgay, string kyHieuChamCong)
        {
            int count = 0;

            if (objChamCongNgay.N1 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N2 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N3 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N4 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N5 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N6 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N7 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N8 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N9 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N10 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N11 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N12 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N13 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N14 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N15 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N16 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N17 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N18 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N19 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N20 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N21 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N22 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N23 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N24 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N25 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N26 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N27 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N28 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N29 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N30 == kyHieuChamCong)
            {
                count++;
            }
            if (objChamCongNgay.N31 == kyHieuChamCong)
            {
                count++;
            }

            return count;
        }

        /// <summary>
        /// Đếm tổng số lần xuất hiện của một Ký Hiệu Chấm Công của Một Nhân Viên trong Một Tháng
        /// </summary>
        /// <param name="idBangChamcong">Mã Bảng Chấm Công</param>
        /// <param name="idNhanVien">Mã Nhân Viên</param>
        /// <param name="kyHieuChamCong">Mã Ký Hiệu Lấy bên bảng CC_KyHieuChamCong</param>
        /// <returns></returns>
        public int CountTongHopChamCongNgayByIdBangChamCongVaIdNhanVienVaKyHieuChamCong(int idBangChamcong, int idNhanVien, string kyHieuChamCong)
        {
            var objChamCongNgay = GetChamCongNgayNhanVienByIdBangChamCongVaIdNhanVien(idBangChamcong, idNhanVien);
            return CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(objChamCongNgay, kyHieuChamCong);
        }

        /// <summary>
        /// Đếm tổng số lần xuất hiện của một Ký Hiệu Chấm Công của Một Nhân Viên trong Một Tháng
        /// </summary>
        /// <param name="thang">Tháng của Bảng Chấm Công</param>
        /// <param name="nam">Năm của Bảng Chấm Công</param>
        /// <param name="idNhanVien">Mã Nhân Viên</param>
        /// <param name="kyHieuChamCong">Mã Ký Hiệu Lấy bên bảng CC_KyHieuChamCong</param>
        /// <returns></returns>
        public int CountTongHopChamCongNgayByThangNamVaIdNhanVienVaKyHieuChamCong(int thang, int nam, int idNhanVien, string kyHieuChamCong)
        {
            var objChamCongNgay = GetChamCongNgayNhanVienByThangNamVaIdNhanVien(thang, nam, idNhanVien);
            return CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(objChamCongNgay, kyHieuChamCong);
        }

        /// <summary>
        /// Lấy Số Giờ Tăng Ca Của Một Nhân Viên trong Một Bảng Chấm Công theo ngày
        /// </summary>
        /// <param name="objChamCongNgay">Dòng dữ liệu Chấm Công một tháng của Một Nhân Viên</param>
        /// <param name="ngay">Ngày cần lấy Số Giờ Tăng Ca trong tháng</param>
        /// <returns></returns>
        public byte GetSoGioTangCaByChamCongNgayVaNgay(CC_ChamCongNgayNhanVien objChamCongNgay, int ngay)
        {
            if (!(ngay >= 0 && ngay <= 31))
            {
                return 0; //Không tồn tại ngày tháng
            }
            byte result;
            switch (ngay)
            {
                case 1:
                    result = objChamCongNgay.TC1;
                    break;
                case 2:
                    result = objChamCongNgay.TC2;
                    break;
                case 3:
                    result = objChamCongNgay.TC3;
                    break;
                case 4:
                    result = objChamCongNgay.TC4;
                    break;
                case 5:
                    result = objChamCongNgay.TC5;
                    break;
                case 6:
                    result = objChamCongNgay.TC6;
                    break;
                case 7:
                    result = objChamCongNgay.TC7;
                    break;
                case 8:
                    result = objChamCongNgay.TC8;
                    break;
                case 9:
                    result = objChamCongNgay.TC9;
                    break;
                case 10:
                    result = objChamCongNgay.TC10;
                    break;
                case 11:
                    result = objChamCongNgay.TC11;
                    break;
                case 12:
                    result = objChamCongNgay.TC12;
                    break;
                case 13:
                    result = objChamCongNgay.TC13;
                    break;
                case 14:
                    result = objChamCongNgay.TC14;
                    break;
                case 15:
                    result = objChamCongNgay.TC15;
                    break;
                case 16:
                    result = objChamCongNgay.TC16;
                    break;
                case 17:
                    result = objChamCongNgay.TC17;
                    break;
                case 18:
                    result = objChamCongNgay.TC18;
                    break;
                case 19:
                    result = objChamCongNgay.TC19;
                    break;
                case 20:
                    result = objChamCongNgay.TC20;
                    break;
                case 21:
                    result = objChamCongNgay.TC21;
                    break;
                case 22:
                    result = objChamCongNgay.TC22;
                    break;
                case 23:
                    result = objChamCongNgay.TC23;
                    break;
                case 24:
                    result = objChamCongNgay.TC24;
                    break;
                case 25:
                    result = objChamCongNgay.TC25;
                    break;
                case 26:
                    result = objChamCongNgay.TC26;
                    break;
                case 27:
                    result = objChamCongNgay.TC27;
                    break;
                case 28:
                    result = objChamCongNgay.TC28;
                    break;
                case 29:
                    result = objChamCongNgay.TC29;
                    break;
                case 30:
                    result = objChamCongNgay.TC30;
                    break;
                default:
                    result = objChamCongNgay.TC31;
                    break;
            }
            return result;
        }

        /// <summary>
        /// Lấy Số Giờ Tăng Ca Của Một Nhân Viên trong Một Bảng Chấm Công theo ngày
        /// </summary>
        /// <param name="idBangChamCong">Mã Bảng Chấm Công</param>
        /// <param name="idNhanVien">Mã Nhân Viên</param>
        /// <param name="ngay">Ngày cần lấy Số Giờ Tăng Ca trong tháng</param>
        /// <returns></returns>
        public byte GetSoGioTangCaByIdBangChamCongVaIdNhanVienVaNgay(int idBangChamCong, int idNhanVien, int ngay)
        {
            var objChamCongNgay = GetChamCongNgayNhanVienByIdBangChamCongVaIdNhanVien(idBangChamCong, idNhanVien);
            return GetSoGioTangCaByChamCongNgayVaNgay(objChamCongNgay, ngay);
        }

        /// <summary>
        /// Lấy Số Giờ Tăng Ca Của Một Nhân Viên theo Ngày Tháng Năm đã chấm công
        /// </summary>
        /// <param name="idNhanVien">Mã Nhân Viên</param>
        /// <param name="ngay">Ngày</param>
        /// <param name="thang">Tháng</param>
        /// <param name="nam">Năm</param>
        /// <returns></returns>
        public byte GetSoGioTangCaByIdNhanVienVaNgayThangNam(int idNhanVien, int ngay, int thang, int nam)
        {
            var objChamCongNgay = GetChamCongNgayNhanVienByThangNamVaIdNhanVien(thang, nam, idNhanVien);
            return GetSoGioTangCaByChamCongNgayVaNgay(objChamCongNgay, ngay);
        }

        /// <summary>
        /// Tổng hợp Tổng Số Giờ Tăng Ca của Một Nhân Viên trong Một Tháng
        /// </summary>
        /// <param name="objChamCongNgay">Bảng Dữ liệu Chấm Công của Một Nhân Viên trong Một Tháng</param>
        /// <returns></returns>
        public int GetTongSoGioTangCaByChamCongNgay(CC_ChamCongNgayNhanVien objChamCongNgay)
        {
            int count = 0;

            count += objChamCongNgay.TC1;
            count += objChamCongNgay.TC2;
            count += objChamCongNgay.TC3;
            count += objChamCongNgay.TC4;
            count += objChamCongNgay.TC5;
            count += objChamCongNgay.TC6;
            count += objChamCongNgay.TC7;
            count += objChamCongNgay.TC8;
            count += objChamCongNgay.TC9;
            count += objChamCongNgay.TC10;
            count += objChamCongNgay.TC11;
            count += objChamCongNgay.TC12;
            count += objChamCongNgay.TC13;
            count += objChamCongNgay.TC14;
            count += objChamCongNgay.TC15;
            count += objChamCongNgay.TC16;
            count += objChamCongNgay.TC17;
            count += objChamCongNgay.TC18;
            count += objChamCongNgay.TC19;
            count += objChamCongNgay.TC20;
            count += objChamCongNgay.TC21;
            count += objChamCongNgay.TC22;
            count += objChamCongNgay.TC23;
            count += objChamCongNgay.TC24;
            count += objChamCongNgay.TC25;
            count += objChamCongNgay.TC26;
            count += objChamCongNgay.TC27;
            count += objChamCongNgay.TC28;
            count += objChamCongNgay.TC29;
            count += objChamCongNgay.TC30;
            count += objChamCongNgay.TC31;

            return count;
        }

        /// <summary>
        /// Tổng hợp Tổng Số Giờ Tăng Ca của Một Nhân Viên trong Một Tháng
        /// </summary>
        /// <param name="idBangChamcong">Mã Bảng Chấm Công</param>
        /// <param name="idNhanVien">Mã Nhân Viên</param>
        /// <returns></returns>
        public int GetTongSoGioTangCaByIdBangChamCongVaIdNhanVien(int idBangChamcong, int idNhanVien)
        {
            var objChamCongNgay = GetChamCongNgayNhanVienByIdBangChamCongVaIdNhanVien(idBangChamcong, idNhanVien);
            return GetTongSoGioTangCaByChamCongNgay(objChamCongNgay);
        }

        /// <summary>
        /// Tổng hợp Tổng Số Giờ Tăng Ca của Một Nhân Viên trong Một Tháng
        /// </summary>
        /// <param name="thang">Tháng của Bảng Chấm Công</param>
        /// <param name="nam">Năm của Bảng Chấm Công</param>
        /// <param name="idNhanVien">Mã Nhân Viên</param>
        /// <returns></returns>
        public int GetTongSoGioTangCaByThangNamVaIdNhanVien(int thang, int nam, int idNhanVien)
        {
            var objChamCongNgay = GetChamCongNgayNhanVienByThangNamVaIdNhanVien(thang, nam, idNhanVien);
            return GetTongSoGioTangCaByChamCongNgay(objChamCongNgay);
        }

        /// <summary>
        /// Lấy dữ liệu chấm công trong ngày của Một Nhân Viên
        /// </summary>
        /// <param name="objChamCongNgay">Bảng Dữ liệu Chấm Công của Một Nhân Viên trong Một Tháng</param>
        /// <param name="ngay">Ngày cần lấy dữ liệu</param>
        /// <returns></returns>
        public NgayTrongThang GetChamCongNgayVaTangCaByChamCongNgayVaNgay(CC_ChamCongNgayNhanVien objChamCongNgay, int ngay)
        {
            var result = new NgayTrongThang();
            CC_KyHieuChamCong _KyHieuChamCong = new CC_KyHieuChamCong();
            result.Ngay = ngay;

            switch (ngay)
            {
                case 1:
                    result.KyHieuChamCong = objChamCongNgay.N1;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N1);
                    if(_KyHieuChamCong!=null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC1;
                    break;
                case 2:
                    result.KyHieuChamCong = objChamCongNgay.N2;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N2);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC2;
                    break;
                case 3:
                    result.KyHieuChamCong = objChamCongNgay.N3;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N3);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC3;
                    break;
                case 4:
                    result.KyHieuChamCong = objChamCongNgay.N4;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N4);
                    if (_KyHieuChamCong != null)    
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC4;
                    break;
                case 5:
                    result.KyHieuChamCong = objChamCongNgay.N5;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N5);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC5;
                    break;
                case 6:
                    result.KyHieuChamCong = objChamCongNgay.N6;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N6);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC6;
                    break;
                case 7:
                    result.KyHieuChamCong = objChamCongNgay.N7;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N7);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC7;
                    break;
                case 8:
                    result.KyHieuChamCong = objChamCongNgay.N8;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N8);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC8;
                    break;
                case 9:
                    result.KyHieuChamCong = objChamCongNgay.N9;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N9);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC9;
                    break;
                case 10:
                    result.KyHieuChamCong = objChamCongNgay.N10;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N10);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC10;
                    break;
                case 11:
                    result.KyHieuChamCong = objChamCongNgay.N11;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N11);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC11;
                    break;
                case 12:
                    result.KyHieuChamCong = objChamCongNgay.N12;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N12);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC12;
                    break;
                case 13:
                    result.KyHieuChamCong = objChamCongNgay.N13;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N13);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC13;
                    break;
                case 14:
                    result.KyHieuChamCong = objChamCongNgay.N14;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N14);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC14;
                    break;
                case 15:
                    result.KyHieuChamCong = objChamCongNgay.N15;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N15);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC15;
                    break;
                case 16:
                    result.KyHieuChamCong = objChamCongNgay.N16;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N16);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC16;
                    break;
                case 17:
                    result.KyHieuChamCong = objChamCongNgay.N17;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N17);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC17;
                    break;
                case 18:
                    result.KyHieuChamCong = objChamCongNgay.N18;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N18);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC18;
                    break;
                case 19:
                    result.KyHieuChamCong = objChamCongNgay.N19;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N19);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC19;
                    break;
                case 20:
                    result.KyHieuChamCong = objChamCongNgay.N20;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N20);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC20;
                    break;
                case 21:
                    result.KyHieuChamCong = objChamCongNgay.N21;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N21);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC21;
                    break;
                case 22:
                    result.KyHieuChamCong = objChamCongNgay.N22;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N22);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC22;
                    break;
                case 23:
                    result.KyHieuChamCong = objChamCongNgay.N23;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N23);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC23;
                    break;
                case 24:
                    result.KyHieuChamCong = objChamCongNgay.N24;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N24);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC24;
                    break;
                case 25:
                    result.KyHieuChamCong = objChamCongNgay.N25;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N25);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC25;
                    break;
                case 26:
                    result.KyHieuChamCong = objChamCongNgay.N26;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N26);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC26;
                    break;
                case 27:
                    result.KyHieuChamCong = objChamCongNgay.N27;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N27);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC27;
                    break;
                case 28:
                    result.KyHieuChamCong = objChamCongNgay.N28;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N28);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC28;
                    break;
                case 29:
                    result.KyHieuChamCong = objChamCongNgay.N29;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N29);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC29;
                    break;
                case 30:
                    result.KyHieuChamCong = objChamCongNgay.N30;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N30);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC30;
                    break;
                default:
                    result.KyHieuChamCong = objChamCongNgay.N31;
                    _KyHieuChamCong = this.GetKyHieuChamCongById(objChamCongNgay.N31);
                    if (_KyHieuChamCong != null)
                        result.TenKyHieu = _KyHieuChamCong.TenKyHieu;
                    result.SoGioTangCa = objChamCongNgay.TC31;
                    break;
            }

            return result;
        }

        /// <summary>
        /// Tổng hợp Tổng Số Giờ Tăng Ca của Một Nhân Viên trong Một Tháng
        /// </summary>
        /// <param name="idBangChamcong">Mã Bảng Chấm Công</param>
        /// <param name="idNhanVien">Mã Nhân Viên</param>
        /// <param name="ngay">Ngày cần lấy dữ liệu</param>
        /// <returns></returns>
        public NgayTrongThang GetChamCongNgayVaTangCaByIdBangChamCongVaIdNhanVienVaNgay(int idBangChamcong, int idNhanVien, int ngay)
        {
            var objChamCongNgay = GetChamCongNgayNhanVienByIdBangChamCongVaIdNhanVien(idBangChamcong, idNhanVien);
            return GetChamCongNgayVaTangCaByChamCongNgayVaNgay(objChamCongNgay, ngay);
        }

        /// <summary>
        /// Tổng hợp Tổng Số Giờ Tăng Ca của Một Nhân Viên trong Một Tháng
        /// </summary>
        /// <param name="thang">Tháng của Bảng Chấm Công</param>
        /// <param name="nam">Năm của Bảng Chấm Công</param>
        /// <param name="idNhanVien">Mã Nhân Viên</param>
        /// <param name="ngay">Ngày cần lấy dữ liệu</param>
        /// <returns></returns>
        public NgayTrongThang GetChamCongNgayVaTangCaByThangNamVaIdNhanVienVaNgay(int thang, int nam, int idNhanVien, int ngay)
        {
            var objChamCongNgay = GetChamCongNgayNhanVienByThangNamVaIdNhanVien(thang, nam, idNhanVien);
            return GetChamCongNgayVaTangCaByChamCongNgayVaNgay(objChamCongNgay, ngay);
        }

        /// <summary>
        /// Lấy dữ liệu chấm công trong ngày của Một Nhân Viên
        /// </summary>
        /// <param name="objChamCongNgay">Bảng Dữ liệu Chấm Công của Một Nhân Viên trong Một Tháng</param>
        /// <returns></returns>
        public IList<NgayTrongThang> GetChamCongNgayVaTangCaByChamCongNgay(CC_ChamCongNgayNhanVien objChamCongNgay)
        {
            var result = new List<NgayTrongThang>();

            var ngay1 = new NgayTrongThang();
            ngay1.Ngay = 1;
            ngay1.KyHieuChamCong = objChamCongNgay.N1;
            ngay1.SoGioTangCa = objChamCongNgay.TC1;
            result.Add(ngay1);

            var ngay2 = new NgayTrongThang();
            ngay2.Ngay = 2;
            ngay2.KyHieuChamCong = objChamCongNgay.N2;
            ngay2.SoGioTangCa = objChamCongNgay.TC2;
            result.Add(ngay2);

            var ngay3 = new NgayTrongThang();
            ngay3.Ngay = 3;
            ngay3.KyHieuChamCong = objChamCongNgay.N3;
            ngay3.SoGioTangCa = objChamCongNgay.TC3;
            result.Add(ngay3);

            var ngay4 = new NgayTrongThang();
            ngay4.Ngay = 4;
            ngay4.KyHieuChamCong = objChamCongNgay.N4;
            ngay4.SoGioTangCa = objChamCongNgay.TC4;
            result.Add(ngay4);

            var ngay5 = new NgayTrongThang();
            ngay5.Ngay = 5;
            ngay5.KyHieuChamCong = objChamCongNgay.N5;
            ngay5.SoGioTangCa = objChamCongNgay.TC5;
            result.Add(ngay5);

            var ngay6 = new NgayTrongThang();
            ngay6.Ngay = 6;
            ngay6.KyHieuChamCong = objChamCongNgay.N6;
            ngay6.SoGioTangCa = objChamCongNgay.TC6;
            result.Add(ngay6);

            var ngay7 = new NgayTrongThang();
            ngay7.Ngay = 7;
            ngay7.KyHieuChamCong = objChamCongNgay.N7;
            ngay7.SoGioTangCa = objChamCongNgay.TC7;
            result.Add(ngay7);

            var ngay8 = new NgayTrongThang();
            ngay8.Ngay = 8;
            ngay8.KyHieuChamCong = objChamCongNgay.N8;
            ngay8.SoGioTangCa = objChamCongNgay.TC8;
            result.Add(ngay8);

            var ngay9 = new NgayTrongThang();
            ngay9.Ngay = 9;
            ngay9.KyHieuChamCong = objChamCongNgay.N9;
            ngay9.SoGioTangCa = objChamCongNgay.TC9;
            result.Add(ngay9);

            var ngay10 = new NgayTrongThang();
            ngay10.Ngay = 10;
            ngay10.KyHieuChamCong = objChamCongNgay.N10;
            ngay10.SoGioTangCa = objChamCongNgay.TC10;
            result.Add(ngay10);

            var ngay11 = new NgayTrongThang();
            ngay11.Ngay = 11;
            ngay11.KyHieuChamCong = objChamCongNgay.N11;
            ngay11.SoGioTangCa = objChamCongNgay.TC11;
            result.Add(ngay11);

            var ngay12 = new NgayTrongThang();
            ngay12.Ngay = 12;
            ngay12.KyHieuChamCong = objChamCongNgay.N12;
            ngay12.SoGioTangCa = objChamCongNgay.TC12;
            result.Add(ngay12);

            var ngay13 = new NgayTrongThang();
            ngay13.Ngay = 13;
            ngay13.KyHieuChamCong = objChamCongNgay.N13;
            ngay13.SoGioTangCa = objChamCongNgay.TC13;
            result.Add(ngay13);

            var ngay14 = new NgayTrongThang();
            ngay14.Ngay = 14;
            ngay14.KyHieuChamCong = objChamCongNgay.N14;
            ngay14.SoGioTangCa = objChamCongNgay.TC14;
            result.Add(ngay14);

            var ngay15 = new NgayTrongThang();
            ngay15.Ngay = 15;
            ngay15.KyHieuChamCong = objChamCongNgay.N15;
            ngay15.SoGioTangCa = objChamCongNgay.TC15;
            result.Add(ngay15);

            var ngay16 = new NgayTrongThang();
            ngay16.Ngay = 16;
            ngay16.KyHieuChamCong = objChamCongNgay.N16;
            ngay16.SoGioTangCa = objChamCongNgay.TC16;
            result.Add(ngay16);

            var ngay17 = new NgayTrongThang();
            ngay17.Ngay = 17;
            ngay17.KyHieuChamCong = objChamCongNgay.N17;
            ngay17.SoGioTangCa = objChamCongNgay.TC17;
            result.Add(ngay17);

            var ngay18 = new NgayTrongThang();
            ngay18.Ngay = 18;
            ngay18.KyHieuChamCong = objChamCongNgay.N18;
            ngay18.SoGioTangCa = objChamCongNgay.TC18;
            result.Add(ngay18);

            var ngay19 = new NgayTrongThang();
            ngay19.Ngay = 19;
            ngay19.KyHieuChamCong = objChamCongNgay.N19;
            ngay19.SoGioTangCa = objChamCongNgay.TC19;
            result.Add(ngay19);

            var ngay20 = new NgayTrongThang();
            ngay20.Ngay = 20;
            ngay20.KyHieuChamCong = objChamCongNgay.N20;
            ngay20.SoGioTangCa = objChamCongNgay.TC20;
            result.Add(ngay20);

            var ngay21 = new NgayTrongThang();
            ngay21.Ngay = 21;
            ngay21.KyHieuChamCong = objChamCongNgay.N21;
            ngay21.SoGioTangCa = objChamCongNgay.TC21;
            result.Add(ngay21);

            var ngay22 = new NgayTrongThang();
            ngay22.Ngay = 22;
            ngay22.KyHieuChamCong = objChamCongNgay.N22;
            ngay22.SoGioTangCa = objChamCongNgay.TC22;
            result.Add(ngay22);

            var ngay23 = new NgayTrongThang();
            ngay23.Ngay = 23;
            ngay23.KyHieuChamCong = objChamCongNgay.N23;
            ngay23.SoGioTangCa = objChamCongNgay.TC23;
            result.Add(ngay23);

            var ngay24 = new NgayTrongThang();
            ngay24.Ngay = 24;
            ngay24.KyHieuChamCong = objChamCongNgay.N24;
            ngay24.SoGioTangCa = objChamCongNgay.TC24;
            result.Add(ngay24);

            var ngay25 = new NgayTrongThang();
            ngay25.Ngay = 25;
            ngay25.KyHieuChamCong = objChamCongNgay.N25;
            ngay25.SoGioTangCa = objChamCongNgay.TC25;
            result.Add(ngay25);

            var ngay26 = new NgayTrongThang();
            ngay26.Ngay = 26;
            ngay26.KyHieuChamCong = objChamCongNgay.N26;
            ngay26.SoGioTangCa = objChamCongNgay.TC26;
            result.Add(ngay26);

            var ngay27 = new NgayTrongThang();
            ngay27.Ngay = 27;
            ngay27.KyHieuChamCong = objChamCongNgay.N27;
            ngay27.SoGioTangCa = objChamCongNgay.TC27;
            result.Add(ngay27);

            var ngay28 = new NgayTrongThang();
            ngay28.Ngay = 28;
            ngay28.KyHieuChamCong = objChamCongNgay.N28;
            ngay28.SoGioTangCa = objChamCongNgay.TC28;
            result.Add(ngay28);

            if (objChamCongNgay.N29 != "KTT")
            {
                var ngay29 = new NgayTrongThang();
                ngay29.Ngay = 29;
                ngay29.KyHieuChamCong = objChamCongNgay.N29;
                ngay29.SoGioTangCa = objChamCongNgay.TC29;
                result.Add(ngay29);
            }

            if (objChamCongNgay.N30 != "KTT")
            {
                var ngay30 = new NgayTrongThang();
                ngay30.Ngay = 30;
                ngay30.KyHieuChamCong = objChamCongNgay.N30;
                ngay30.SoGioTangCa = objChamCongNgay.TC30;
                result.Add(ngay30);
            }

            if (objChamCongNgay.N31 != "KTT")
            {
                var ngay31 = new NgayTrongThang();
                ngay31.Ngay = 31;
                ngay31.KyHieuChamCong = objChamCongNgay.N31;
                ngay31.SoGioTangCa = objChamCongNgay.TC31;
                result.Add(ngay31);
            }

            return result;
        }

        /// <summary>
        /// Lấy dữ liệu chấm công trong ngày của Một Nhân Viên
        /// </summary>
        /// <param name="idBangChamcong">Mã Bảng Chấm Công</param>
        /// <param name="idNhanVien">Mã Nhân Viên</param>
        /// <returns></returns>
        public IList<NgayTrongThang> GetChamCongNgayVaTangCaByIdBangChamCongVaIdNhanVien(int idBangChamcong, int idNhanVien)
        {
            var objChamCongNgay = GetChamCongNgayNhanVienByIdBangChamCongVaIdNhanVien(idBangChamcong, idNhanVien);
            return GetChamCongNgayVaTangCaByChamCongNgay(objChamCongNgay);
        }

        /// <summary>
        /// Lấy dữ liệu chấm công trong ngày của Một Nhân Viên
        /// </summary>
        /// <param name="thang">Tháng của Bảng Chấm Công</param>
        /// <param name="nam">Năm của Bảng Chấm Công</param>
        /// <param name="idNhanVien">Mã Nhân Viên</param>
        /// <returns></returns>
        public IList<NgayTrongThang> GetChamCongNgayVaTangCaByThangNamVaIdNhanVien(int thang, int nam, int idNhanVien)
        {
            var objChamCongNgay = GetChamCongNgayNhanVienByThangNamVaIdNhanVien(thang, nam, idNhanVien);
            return GetChamCongNgayVaTangCaByChamCongNgay(objChamCongNgay);
        }

        #endregion

        #endregion

        #region Bảng CC_KyHieuChamCong

        private IQueryable<CC_KyHieuChamCong> QueryGetAllKyHieuChamCong()
        {
            return _dBChamCong.CC_KyHieuChamCongs;
        }

        public IList<CC_KyHieuChamCong> GetAllKyHieuChamCong()
        {
            return QueryGetAllKyHieuChamCong().OrderBy(p => p.ThuTu).ToList();
        }

        public IList<CC_KyHieuChamCong> GetAllActiveKyHieuChamCong()
        {
            return QueryGetAllKyHieuChamCong().Where(p => p.IsActive).OrderBy(p => p.ThuTu).ToList();
        }

        public CC_KyHieuChamCong GetKyHieuChamCongById(string id)
        {
            return QueryGetAllKyHieuChamCong().SingleOrDefault(p => p.ID.Equals(id));
        }

        #endregion

        #region Bảng hs_NhanVien

        private IQueryable<hs_NhanVien> QueryGetAllNhanVien()
        {
            return _dBChamCong.hs_NhanViens;
        }

        private IQueryable<int> QueryGetAllMaNhanVien()
        {
            return QueryGetAllNhanVien().Select(p => p.Id);
        }

        public IList<hs_NhanVien> GetAllNhanVien()
        {
            return QueryGetAllNhanVien().ToList();
        }

        /// <summary>
        /// Lấy tất cả mã nhân viên trong Bảng Nhân Viên
        /// </summary>
        /// <returns></returns>
        public IList<int> GetAllMaNhanVien()
        {
            return QueryGetAllMaNhanVien().ToList();
        }

        public hs_NhanVien GetNhanVienById(int? idNhanVien)
        {
            try
            {
                return QueryGetAllNhanVien().Single(p => p.Id == idNhanVien);
            }
            catch (Exception)
            {
                return null;
            }
        }

        public string GhepHoVaTen(string hoNhanVien, string tenNhanVien)
        {
            hoNhanVien = !string.IsNullOrEmpty(hoNhanVien) ? hoNhanVien.Trim() : string.Empty;
            tenNhanVien = !string.IsNullOrEmpty(tenNhanVien) ? tenNhanVien.Trim() : string.Empty;
            if (!string.IsNullOrEmpty(hoNhanVien) && !string.IsNullOrEmpty(tenNhanVien))
                return hoNhanVien + " " + tenNhanVien;
            if (string.IsNullOrEmpty(hoNhanVien) && string.IsNullOrEmpty(tenNhanVien))
                return string.Empty;
            if (!string.IsNullOrEmpty(hoNhanVien))
            {
                return hoNhanVien;
            }
            return tenNhanVien;
        }

        #endregion

        #region Bảng JobTiles
        public IList<TB_JobTitle> GetAllJobtiles()
        {
            return _dBChamCong.TB_JobTitles.Where(p => p.IsDelete == false || p.IsDelete == null).ToList();
        }

        #endregion

        #region Bảng tb_TinhLuongThang_ThuongKmTrongThang
        public IList<tb_TinhLuongThang_ThuongKmTrongThang> GetAllThuongKmTrongThang(int IdNhanVien, string ngayluu)
        {
            try {
                return _dBChamCong.tb_TinhLuongThang_ThuongKmTrongThangs.Where(p => p.MaNhanVien == IdNhanVien && p.NgayLam == Common.DateTimeExtension.ConvertStringDDMMYYYYToYYYYMMDD(ngayluu)).ToList();
            }
            catch (Exception) { return null; }
        }

        public int GetSoChuyenDiTrongThuong(int idkm,int idbuoi,int IdMaNhanVien,string Ngayluu )
        {
            try
            {
                return _dBChamCong.tb_TinhLuongThang_ThuongKmTrongThangs.Where(p => p.IdMaBuoi == idbuoi && p.IdMaSoKm == idkm && p.MaNhanVien == IdMaNhanVien && p.NgayLam == Common.DateTimeExtension.ConvertStringDDMMYYYYToYYYYMMDD(Ngayluu)).Sum(p => p.SoChuyen ?? 0);
            }
            catch (Exception) { return 0; }
        }
        #endregion

        #endregion

        #region Set

        #region Bảng CC_BangChamCong

        public CC_BangChamCong AddBangChamCong(CC_BangChamCong objBangChamCong)
        {
            try
            {
                objBangChamCong.NguoiTao = _currentUserId;
                objBangChamCong.NgayTao = DateTime.Now;
                objBangChamCong.NguoiSua = _currentUserId;
                objBangChamCong.NgaySua = DateTime.Now;
                objBangChamCong.IsLock = false;
                objBangChamCong.IsFinish = false;
                _dBChamCong.CC_BangChamCongs.InsertOnSubmit(objBangChamCong);
                _dBChamCong.SubmitChanges();
                return objBangChamCong;
            }
            catch (Exception)
            {
                return null;
            }
        }

        public CC_BangChamCong UpdateBangChamCong(CC_BangChamCong objBangChamCong)
        {
            try
            {
                objBangChamCong.NguoiSua = _currentUserId;
                objBangChamCong.NgaySua = DateTime.Now;
                _dBChamCong.SubmitChanges();
                return objBangChamCong;
            }
            catch (Exception)
            {
                return null;
            }
        }

        public bool DeleteBangChamCong(CC_BangChamCong objBangChamCong)
        {
            try
            {
                _dBChamCong.CC_BangChamCongs.DeleteOnSubmit(objBangChamCong);
                _dBChamCong.SubmitChanges();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public bool DeleteBangChamCong(int? idBangChamCong)
        {
            CC_BangChamCong objBangChamCong = GetBangChamCongByIdBangChamCong(idBangChamCong);
            return DeleteBangChamCong(objBangChamCong);
        }

        public bool DeleteBangChamCong(string idBangChamCong)
        {
            CC_BangChamCong objBangChamCong = GetBangChamCongByIdBangChamCong(idBangChamCong);
            return DeleteBangChamCong(objBangChamCong);
        }

        #endregion

        #region Bảng CC_ChamCongNgayNhanVien

        public CC_ChamCongNgayNhanVien AddChamCongNgayNhanVien(CC_ChamCongNgayNhanVien objChamCongNgayNhanVien)
        {
            try
            {
                objChamCongNgayNhanVien.NguoiTao = _currentUserId;
                objChamCongNgayNhanVien.NgayTao = DateTime.Now;
                _dBChamCong.CC_ChamCongNgayNhanViens.InsertOnSubmit(objChamCongNgayNhanVien);
                _dBChamCong.SubmitChanges();
                return objChamCongNgayNhanVien;
            }
            catch (Exception)
            {
                return null;
            }
        }

        public CC_ChamCongNgayNhanVien UpdateChamCongNgayNhanVien(CC_ChamCongNgayNhanVien objChamCongNgayNhanVien)
        {
            try
            {
                _dBChamCong.SubmitChanges();
                return objChamCongNgayNhanVien;
            }
            catch (Exception)
            {
                return null;
            }
        }

        public bool DeleteChamCongNgayNhanVien(CC_ChamCongNgayNhanVien objChamCongNgayNhanVien)
        {
            try
            {
                _dBChamCong.CC_ChamCongNgayNhanViens.DeleteOnSubmit(objChamCongNgayNhanVien);
                _dBChamCong.SubmitChanges();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public void BuildUpdateChamCongNgayNhanVien(CC_ChamCongNgayNhanVien objChamCongNgayNhanVien, int ngay, string kyHieuChamCong)
        {
            switch (ngay)
            {
                case 1:
                    objChamCongNgayNhanVien.N1 = kyHieuChamCong;
                    break;
                case 2:
                    objChamCongNgayNhanVien.N2 = kyHieuChamCong;
                    break;
                case 3:
                    objChamCongNgayNhanVien.N3 = kyHieuChamCong;
                    break;
                case 4:
                    objChamCongNgayNhanVien.N4 = kyHieuChamCong;
                    break;
                case 5:
                    objChamCongNgayNhanVien.N5 = kyHieuChamCong;
                    break;
                case 6:
                    objChamCongNgayNhanVien.N6 = kyHieuChamCong;
                    break;
                case 7:
                    objChamCongNgayNhanVien.N7 = kyHieuChamCong;
                    break;
                case 8:
                    objChamCongNgayNhanVien.N8 = kyHieuChamCong;
                    break;
                case 9:
                    objChamCongNgayNhanVien.N9 = kyHieuChamCong;
                    break;
                case 10:
                    objChamCongNgayNhanVien.N10 = kyHieuChamCong;
                    break;
                case 11:
                    objChamCongNgayNhanVien.N11 = kyHieuChamCong;
                    break;
                case 12:
                    objChamCongNgayNhanVien.N12 = kyHieuChamCong;
                    break;
                case 13:
                    objChamCongNgayNhanVien.N13 = kyHieuChamCong;
                    break;
                case 14:
                    objChamCongNgayNhanVien.N14 = kyHieuChamCong;
                    break;
                case 15:
                    objChamCongNgayNhanVien.N15 = kyHieuChamCong;
                    break;
                case 16:
                    objChamCongNgayNhanVien.N16 = kyHieuChamCong;
                    break;
                case 17:
                    objChamCongNgayNhanVien.N17 = kyHieuChamCong;
                    break;
                case 18:
                    objChamCongNgayNhanVien.N18 = kyHieuChamCong;
                    break;
                case 19:
                    objChamCongNgayNhanVien.N19 = kyHieuChamCong;
                    break;
                case 20:
                    objChamCongNgayNhanVien.N20 = kyHieuChamCong;
                    break;
                case 21:
                    objChamCongNgayNhanVien.N21 = kyHieuChamCong;
                    break;
                case 22:
                    objChamCongNgayNhanVien.N22 = kyHieuChamCong;
                    break;
                case 23:
                    objChamCongNgayNhanVien.N23 = kyHieuChamCong;
                    break;
                case 24:
                    objChamCongNgayNhanVien.N24 = kyHieuChamCong;
                    break;
                case 25:
                    objChamCongNgayNhanVien.N25 = kyHieuChamCong;
                    break;
                case 26:
                    objChamCongNgayNhanVien.N26 = kyHieuChamCong;
                    break;
                case 27:
                    objChamCongNgayNhanVien.N27 = kyHieuChamCong;
                    break;
                case 28:
                    objChamCongNgayNhanVien.N28 = kyHieuChamCong;
                    break;
                case 29:
                    objChamCongNgayNhanVien.N29 = kyHieuChamCong;
                    break;
                case 30:
                    objChamCongNgayNhanVien.N30 = kyHieuChamCong;
                    break;
                case 31:
                    objChamCongNgayNhanVien.N31 = kyHieuChamCong;
                    break;
            }
        }

        public void BuildUpdateChamCongNgayNhanVien(CC_ChamCongNgayNhanVien objChamCongNgayNhanVien, int ngay, string kyHieuChamCong, byte soGioTangCa)
        {
            switch (ngay)
            {
                case 1:
                    objChamCongNgayNhanVien.N1 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC1 = soGioTangCa;
                    break;
                case 2:
                    objChamCongNgayNhanVien.N2 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC2 = soGioTangCa;
                    break;
                case 3:
                    objChamCongNgayNhanVien.N3 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC3 = soGioTangCa;
                    break;
                case 4:
                    objChamCongNgayNhanVien.N4 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC4 = soGioTangCa;
                    break;
                case 5:
                    objChamCongNgayNhanVien.N5 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC5 = soGioTangCa;
                    break;
                case 6:
                    objChamCongNgayNhanVien.N6 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC6 = soGioTangCa;
                    break;
                case 7:
                    objChamCongNgayNhanVien.N7 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC7 = soGioTangCa;
                    break;
                case 8:
                    objChamCongNgayNhanVien.N8 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC8 = soGioTangCa;
                    break;
                case 9:
                    objChamCongNgayNhanVien.N9 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC9 = soGioTangCa;
                    break;
                case 10:
                    objChamCongNgayNhanVien.N10 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC10 = soGioTangCa;
                    break;
                case 11:
                    objChamCongNgayNhanVien.N11 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC11 = soGioTangCa;
                    break;
                case 12:
                    objChamCongNgayNhanVien.N12 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC12 = soGioTangCa;
                    break;
                case 13:
                    objChamCongNgayNhanVien.N13 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC13 = soGioTangCa;
                    break;
                case 14:
                    objChamCongNgayNhanVien.N14 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC14 = soGioTangCa;
                    break;
                case 15:
                    objChamCongNgayNhanVien.N15 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC15 = soGioTangCa;
                    break;
                case 16:
                    objChamCongNgayNhanVien.N16 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC16 = soGioTangCa;
                    break;
                case 17:
                    objChamCongNgayNhanVien.N17 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC17 = soGioTangCa;
                    break;
                case 18:
                    objChamCongNgayNhanVien.N18 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC18 = soGioTangCa;
                    break;
                case 19:
                    objChamCongNgayNhanVien.N19 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC19 = soGioTangCa;
                    break;
                case 20:
                    objChamCongNgayNhanVien.N20 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC20 = soGioTangCa;
                    break;
                case 21:
                    objChamCongNgayNhanVien.N21 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC21 = soGioTangCa;
                    break;
                case 22:
                    objChamCongNgayNhanVien.N22 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC22 = soGioTangCa;
                    break;
                case 23:
                    objChamCongNgayNhanVien.N23 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC23 = soGioTangCa;
                    break;
                case 24:
                    objChamCongNgayNhanVien.N24 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC24 = soGioTangCa;
                    break;
                case 25:
                    objChamCongNgayNhanVien.N25 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC25 = soGioTangCa;
                    break;
                case 26:
                    objChamCongNgayNhanVien.N26 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC26 = soGioTangCa;
                    break;
                case 27:
                    objChamCongNgayNhanVien.N27 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC27 = soGioTangCa;
                    break;
                case 28:
                    objChamCongNgayNhanVien.N28 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC28 = soGioTangCa;
                    break;
                case 29:
                    objChamCongNgayNhanVien.N29 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC29 = soGioTangCa;
                    break;
                case 30:
                    objChamCongNgayNhanVien.N30 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC30 = soGioTangCa;
                    break;
                case 31:
                    objChamCongNgayNhanVien.N31 = kyHieuChamCong;
                    objChamCongNgayNhanVien.TC31 = soGioTangCa;
                    break;
            }
        }

        public void BuildUpdateChamCongNgayNhanVien(CC_ChamCongNgayNhanVien objChamCongNgayNhanVien, int ngay, byte soGioTangCa)
        {
            switch (ngay)
            {
                case 1:
                    objChamCongNgayNhanVien.TC1 = soGioTangCa;
                    break;
                case 2:
                    objChamCongNgayNhanVien.TC2 = soGioTangCa;
                    break;
                case 3:
                    objChamCongNgayNhanVien.TC3 = soGioTangCa;
                    break;
                case 4:
                    objChamCongNgayNhanVien.TC4 = soGioTangCa;
                    break;
                case 5:
                    objChamCongNgayNhanVien.TC5 = soGioTangCa;
                    break;
                case 6:
                    objChamCongNgayNhanVien.TC6 = soGioTangCa;
                    break;
                case 7:
                    objChamCongNgayNhanVien.TC7 = soGioTangCa;
                    break;
                case 8:
                    objChamCongNgayNhanVien.TC8 = soGioTangCa;
                    break;
                case 9:
                    objChamCongNgayNhanVien.TC9 = soGioTangCa;
                    break;
                case 10:
                    objChamCongNgayNhanVien.TC10 = soGioTangCa;
                    break;
                case 11:
                    objChamCongNgayNhanVien.TC11 = soGioTangCa;
                    break;
                case 12:
                    objChamCongNgayNhanVien.TC12 = soGioTangCa;
                    break;
                case 13:
                    objChamCongNgayNhanVien.TC13 = soGioTangCa;
                    break;
                case 14:
                    objChamCongNgayNhanVien.TC14 = soGioTangCa;
                    break;
                case 15:
                    objChamCongNgayNhanVien.TC15 = soGioTangCa;
                    break;
                case 16:
                    objChamCongNgayNhanVien.TC16 = soGioTangCa;
                    break;
                case 17:
                    objChamCongNgayNhanVien.TC17 = soGioTangCa;
                    break;
                case 18:
                    objChamCongNgayNhanVien.TC18 = soGioTangCa;
                    break;
                case 19:
                    objChamCongNgayNhanVien.TC19 = soGioTangCa;
                    break;
                case 20:
                    objChamCongNgayNhanVien.TC20 = soGioTangCa;
                    break;
                case 21:
                    objChamCongNgayNhanVien.TC21 = soGioTangCa;
                    break;
                case 22:
                    objChamCongNgayNhanVien.TC22 = soGioTangCa;
                    break;
                case 23:
                    objChamCongNgayNhanVien.TC23 = soGioTangCa;
                    break;
                case 24:
                    objChamCongNgayNhanVien.TC24 = soGioTangCa;
                    break;
                case 25:
                    objChamCongNgayNhanVien.TC25 = soGioTangCa;
                    break;
                case 26:
                    objChamCongNgayNhanVien.TC26 = soGioTangCa;
                    break;
                case 27:
                    objChamCongNgayNhanVien.TC27 = soGioTangCa;
                    break;
                case 28:
                    objChamCongNgayNhanVien.TC28 = soGioTangCa;
                    break;
                case 29:
                    objChamCongNgayNhanVien.TC29 = soGioTangCa;
                    break;
                case 30:
                    objChamCongNgayNhanVien.TC30 = soGioTangCa;
                    break;
                case 31:
                    objChamCongNgayNhanVien.TC31 = soGioTangCa;
                    break;
            }
        }

        #endregion

        #endregion

        #region Build

        public IList<KyHieuChamCongForm> BuildListAllKyHieuChamCong()
        {
            return
                GetAllKyHieuChamCong().ToList().Select(
                    p => new KyHieuChamCongForm(p.ID, p.KyHieu, p.TenKyHieu, p.MoTa, p.ThuTu, p.IsActive)).ToList();
        }

        #endregion

        #region Hỗ trợ

        /// <summary>
        /// Build Chấm Công Các Ngày Chủ Nhật trong Tháng của Bảng Chấm Công Ngày
        /// </summary>
        /// <param name="objChamCongNgayNhanVien"></param>
        /// <param name="thang"></param>
        /// <param name="nam"></param>
        public void BuildNgayChuNhatChoChamCongNgay(CC_ChamCongNgayNhanVien objChamCongNgayNhanVien, int thang, int nam)
        {
            var today = DateTime.Today;

            if ((nam == today.Year && thang >= today.Month) || nam > today.Year)
            {
                #region 1
                objChamCongNgayNhanVien.N1 = _commonDelegate.DateIsSunday(1, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N2 = _commonDelegate.DateIsSunday(2, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N3 = _commonDelegate.DateIsSunday(3, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N4 = _commonDelegate.DateIsSunday(4, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N5 = _commonDelegate.DateIsSunday(5, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N6 = _commonDelegate.DateIsSunday(6, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N7 = _commonDelegate.DateIsSunday(7, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N8 = _commonDelegate.DateIsSunday(8, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N9 = _commonDelegate.DateIsSunday(9, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N10 = _commonDelegate.DateIsSunday(10, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N11 = _commonDelegate.DateIsSunday(11, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N12 = _commonDelegate.DateIsSunday(12, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N13 = _commonDelegate.DateIsSunday(13, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N14 = _commonDelegate.DateIsSunday(14, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N15 = _commonDelegate.DateIsSunday(15, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N16 = _commonDelegate.DateIsSunday(16, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N17 = _commonDelegate.DateIsSunday(17, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N18 = _commonDelegate.DateIsSunday(18, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N19 = _commonDelegate.DateIsSunday(19, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N20 = _commonDelegate.DateIsSunday(20, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N21 = _commonDelegate.DateIsSunday(21, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N22 = _commonDelegate.DateIsSunday(22, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N23 = _commonDelegate.DateIsSunday(23, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N24 = _commonDelegate.DateIsSunday(24, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N25 = _commonDelegate.DateIsSunday(25, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N26 = _commonDelegate.DateIsSunday(26, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N27 = _commonDelegate.DateIsSunday(27, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N28 = _commonDelegate.DateIsSunday(28, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N29 = DateTime.DaysInMonth(nam, thang) >= 29
                                                  ? (_commonDelegate.DateIsSunday(29, thang, nam) ? "NN" : string.Empty)
                                                  : "KTT";
                objChamCongNgayNhanVien.N30 = DateTime.DaysInMonth(nam, thang) >= 30
                                                  ? (_commonDelegate.DateIsSunday(30, thang, nam) ? "NN" : string.Empty)
                                                  : "KTT";
                objChamCongNgayNhanVien.N31 = DateTime.DaysInMonth(nam, thang) == 31
                                                  ? (_commonDelegate.DateIsSunday(31, thang, nam) ? "NN" : string.Empty)
                                                  : "KTT";
                #endregion
            }
            else
            {
                #region 2
                objChamCongNgayNhanVien.N1 = _commonDelegate.DateIsSunday(1, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N2 = _commonDelegate.DateIsSunday(2, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N3 = _commonDelegate.DateIsSunday(3, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N4 = _commonDelegate.DateIsSunday(4, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N5 = _commonDelegate.DateIsSunday(5, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N6 = _commonDelegate.DateIsSunday(6, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N7 = _commonDelegate.DateIsSunday(7, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N8 = _commonDelegate.DateIsSunday(8, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N9 = _commonDelegate.DateIsSunday(9, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N10 = _commonDelegate.DateIsSunday(10, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N11 = _commonDelegate.DateIsSunday(11, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N12 = _commonDelegate.DateIsSunday(12, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N13 = _commonDelegate.DateIsSunday(13, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N14 = _commonDelegate.DateIsSunday(14, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N15 = _commonDelegate.DateIsSunday(15, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N16 = _commonDelegate.DateIsSunday(16, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N17 = _commonDelegate.DateIsSunday(17, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N18 = _commonDelegate.DateIsSunday(18, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N19 = _commonDelegate.DateIsSunday(19, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N20 = _commonDelegate.DateIsSunday(20, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N21 = _commonDelegate.DateIsSunday(21, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N22 = _commonDelegate.DateIsSunday(22, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N23 = _commonDelegate.DateIsSunday(23, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N24 = _commonDelegate.DateIsSunday(24, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N25 = _commonDelegate.DateIsSunday(25, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N26 = _commonDelegate.DateIsSunday(26, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N27 = _commonDelegate.DateIsSunday(27, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N28 = _commonDelegate.DateIsSunday(28, thang, nam) ? "NN" : string.Empty;
                objChamCongNgayNhanVien.N29 = DateTime.DaysInMonth(nam, thang) >= 29
                                                  ? (_commonDelegate.DateIsSunday(29, thang, nam) ? "NN" : string.Empty)
                                                  : "KTT";
                objChamCongNgayNhanVien.N30 = DateTime.DaysInMonth(nam, thang) >= 30
                                                  ? (_commonDelegate.DateIsSunday(30, thang, nam) ? "NN" : string.Empty)
                                                  : "KTT";
                objChamCongNgayNhanVien.N31 = DateTime.DaysInMonth(nam, thang) == 31
                                                  ? (_commonDelegate.DateIsSunday(31, thang, nam) ? "NN" : string.Empty)
                                                  : "KTT";
                #endregion
            }
        }

        public void CopyDataChamCongNgayNhanVien(CC_ChamCongNgayNhanVien objNguon, CC_ChamCongNgayNhanVien objDich)
        {
            objDich.N1 = objNguon.N1;
            objDich.N2 = objNguon.N2;
            objDich.N3 = objNguon.N3;
            objDich.N4 = objNguon.N4;
            objDich.N5 = objNguon.N5;
            objDich.N6 = objNguon.N6;
            objDich.N7 = objNguon.N7;
            objDich.N8 = objNguon.N8;
            objDich.N9 = objNguon.N9;
            objDich.N10 = objNguon.N10;
            objDich.N11 = objNguon.N11;
            objDich.N12 = objNguon.N12;
            objDich.N13 = objNguon.N13;
            objDich.N14 = objNguon.N14;
            objDich.N15 = objNguon.N15;
            objDich.N16 = objNguon.N16;
            objDich.N17 = objNguon.N17;
            objDich.N18 = objNguon.N18;
            objDich.N19 = objNguon.N19;
            objDich.N20 = objNguon.N20;
            objDich.N21 = objNguon.N21;
            objDich.N22 = objNguon.N22;
            objDich.N23 = objNguon.N23;
            objDich.N24 = objNguon.N24;
            objDich.N25 = objNguon.N25;
            objDich.N26 = objNguon.N26;
            objDich.N27 = objNguon.N27;
            objDich.N28 = objNguon.N28;
            objDich.N29 = objNguon.N29;
            objDich.N30 = objNguon.N30;
            objDich.N31 = objNguon.N31;
        }

        /// <summary>
        /// Lấy Số Ngày Thiếu của một bảng chấm công
        /// Một tháng được coi là thiếu nếu Số Ngày Phải Chấm Công nhỏ hơn 26 (+), nếu bằng 26 là đủ, và lớn hơn là dư (-)
        /// </summary>
        /// <param name="thang"></param>
        /// <param name="nam"></param>
        /// <returns>0: Đủ Ngày; Âm: Dư Ngày; Dương: Thiếu Ngày</returns>
        public int GetSoNgayThieu(int thang, int nam)
        {
            //Ngày đầu tiên của tháng
            DateTime ngayDauTrongThang = _commonDelegate.ConvertToDateTime(1, thang, nam).Value;

            //Tổng Số Ngày Trong Tháng
            int soNgayTrongThang = DateTime.DaysInMonth(nam, thang);

            //Tổng Số Ngày Chủ Nhật Trong Tháng
            int soNgayChuNhatTrongThang = 0;

            //Đếm Số Ngày Chủ Nhật Trong Tháng
            for (int indexNgay = 0; indexNgay <= soNgayTrongThang; indexNgay++)
            {
                if (ngayDauTrongThang.AddDays(indexNgay).DayOfWeek == DayOfWeek.Sunday)
                    soNgayChuNhatTrongThang++;
            }

            //Tổng Số Ngày Phải Chấm Công Trong Tháng
            int soNgayPhaiChamCong = soNgayTrongThang - soNgayChuNhatTrongThang;

            //Tổng Số Ngày Thiếu Của Tháng
            //Một tháng được coi là thiếu nếu Số Ngày Phải Chấm Công nhỏ hơn 26 (+), nếu bằng 26 là đủ, và lớn hơn là dư (-)
            int soNgayThieu = 26 - soNgayPhaiChamCong;

            return soNgayThieu;
        }

        #endregion

        #region BACNP

        #region Get
        #endregion

        #region Set

        public bool ThemMoiBangChamCong(BangChamCongForm form)
        {
            if (IsExistsBangChamCong(form.Thang, form.Nam))
            {
                form.MessageError =
                    string.Format(
                        "Thông tin bảng chấm công tháng {0}/{1} (<a href='/ChamCong/SuaBangChamCong/{2}' target='_blank' title='Xem bảng chấm công tháng {3}/{4}'>Xem</a>) đã được tạo trước đó! Vui lòng chọn tháng khác để tạo bảng chấm công!",
                        form.Thang.ToString("0#"), form.Nam, GetIdBangChamCongByThangNam(form.Thang, form.Nam),
                        form.Thang.ToString("0#"), form.Nam);
                return false;
            }
            var objBangChamCong = new CC_BangChamCong();
            objBangChamCong = BuildBangChamCongLinQ(form);
            objBangChamCong = AddBangChamCong(objBangChamCong);
            if (objBangChamCong != null)
            {
                form.Id = objBangChamCong.ID;
                form.MessageSuccess =
                    string.Format(
                        "Đã tạo bảng chấm công tháng {0}/{1} thành công! Bạn hãy thêm <a href='/ChamCong/NhanVienTrongBangChamCong/{2}' target='_blank' title='Danh sách nhân viên trong bảng chấm công tháng {3}/{4}' class='red'>nhân viên</a> vào bảng chấm công này để thực hiện chấm công!",
                        objBangChamCong.Thang.ToString("0#"), objBangChamCong.Nam, objBangChamCong.ID,
                        objBangChamCong.Thang.ToString("0#"), objBangChamCong.Nam);
                return true;
            }

            form.MessageError = string.Format(
                "Tạo bảng chấm công tháng {0}/{1} thất bại! Đã có lỗi xảy ra! Vui lòng thử lại sau!",
                form.Thang.ToString("0#"), form.Nam);
            return false;
        }

        public bool CapNhatBangChamCong(BangChamCongForm form)
        {
            if (!IsDuocPhepChinhSuaBangChamCong(form.Thang, form.Nam))
            {
                form.MessageError =
                    string.Format(
                        "Lưu thất bại! Thông tin bảng chấm công tháng {0}/{1} đã bị khóa hoặc đã hoàn thành! Không thể thực hiện lưu!",
                        form.Thang.ToString("0#"), form.Nam);
                return false;
            }
            var objBangChamCong = GetBangChamCongByIdBangChamCong(form.Id);
            objBangChamCong = BuildBangChamCongLinQ(form);
            objBangChamCong = UpdateBangChamCong(objBangChamCong);
            if (objBangChamCong != null)
            {
                form.MessageSuccess =
                    string.Format(
                        "Lưu thông tin bảng chấm công tháng {0}/{1} thành công!",
                        objBangChamCong.Thang.ToString("0#"), objBangChamCong.Nam);
                return true;
            }

            form.MessageError = string.Format(
                "Lưu thông tin bảng chấm công tháng {0}/{1} thất bại! Đã có lỗi xảy ra! Vui lòng thử lại sau!",
                form.Thang.ToString("0#"), form.Nam);
            return false;
        }

        public bool KhoaBangChamCong(BangChamCongForm form)
        {
            var objBangChamCong = GetBangChamCongByIdBangChamCong(form.Id);

            if (objBangChamCong == null)
            {
                form.MessageError =
                    string.Format(
                        " Thông tin bảng chấm công tháng {0}/{1} không tồn tại trong hệ thống!",
                        form.Thang.ToString("0#"), form.Nam);
                return false;
            }
            if (objBangChamCong.IsFinish)
            {
                form.IsFinish = true;
                form.MessageError =
                    string.Format(
                        "Khóa bảng chấm công tháng {0}/{1} thất bại! Bảng chấm công tháng này đã được hoàn thành trước đó!",
                        form.Thang.ToString("0#"), form.Nam);
                return false;
            }

            objBangChamCong.IsLock = true;
            objBangChamCong = UpdateBangChamCong(objBangChamCong);
            if (objBangChamCong != null)
            {
                form.IsLock = true;
                form.MessageSuccess =
                    string.Format(
                        "Khóa thành công Bảng chấm công tháng {0}/{1}!",
                        objBangChamCong.Thang.ToString("0#"), objBangChamCong.Nam);
                return true;
            }

            form.MessageError = string.Format(
                "Khóa bảng chấm công tháng {0}/{1} thất bại! Đã có lỗi xảy ra! Vui lòng thử lại sau!",
                form.Thang.ToString("0#"), form.Nam);
            return false;
        }

        public bool MoKhoaBangChamCong(BangChamCongForm form)
        {
            var objBangChamCong = GetBangChamCongByIdBangChamCong(form.Id);

            if (objBangChamCong == null)
            {
                form.MessageError =
                    string.Format(
                        " Thông tin bảng chấm công tháng {0}/{1} không tồn tại trong hệ thống!",
                        form.Thang.ToString("0#"), form.Nam);
                return false;
            }
            if (objBangChamCong.IsFinish)
            {
                form.IsFinish = true;
                form.MessageError =
                    string.Format(
                        "Mở Khóa bảng chấm công tháng {0}/{1} thất bại! Bảng chấm công tháng này đã được hoàn thành trước đó!",
                        form.Thang.ToString("0#"), form.Nam);
                return false;
            }

            objBangChamCong.IsLock = false;
            objBangChamCong = UpdateBangChamCong(objBangChamCong);
            if (objBangChamCong != null)
            {
                form.IsLock = false;
                form.MessageSuccess =
                    string.Format(
                        "Mở Khóa thành công Bảng chấm công tháng {0}/{1}!",
                        objBangChamCong.Thang.ToString("0#"), objBangChamCong.Nam);
                return true;
            }

            form.MessageError = string.Format(
                "Mở Khóa bảng chấm công tháng {0}/{1} thất bại! Đã có lỗi xảy ra! Vui lòng thử lại sau!",
                form.Thang.ToString("0#"), form.Nam);
            return false;
        }

        public bool HoanThanhBangChamCong(BangChamCongForm form)
        {
            var objBangChamCong = GetBangChamCongByIdBangChamCong(form.Id);

            if (objBangChamCong == null)
            {
                form.MessageError =
                    string.Format(
                        " Thông tin bảng chấm công tháng {0}/{1} không tồn tại trong hệ thống!",
                        form.Thang.ToString("0#"), form.Nam);
                return false;
            }
            if (objBangChamCong.IsFinish)
            {
                form.IsFinish = true;
                form.MessageError =
                    string.Format(
                        "Hoàn Thành bảng chấm công tháng {0}/{1} thất bại! Bảng chấm công tháng này đã được hoàn thành trước đó!",
                        form.Thang.ToString("0#"), form.Nam);
                return false;
            }

            objBangChamCong = BuildBangChamCongLinQ(form);
            objBangChamCong.IsLock = true;
            objBangChamCong.IsFinish = true;
            objBangChamCong = UpdateBangChamCong(objBangChamCong);
            if (objBangChamCong != null)
            {
                form.IsLock = true;
                form.IsFinish = true;
                form.MessageSuccess =
                    string.Format(
                        "Bảng chấm công tháng {0}/{1} đã được hoàn thành!",
                        objBangChamCong.Thang.ToString("0#"), objBangChamCong.Nam);
                return true;
            }

            form.MessageError = string.Format(
                "Hoàn Thành bảng chấm công tháng {0}/{1} thất bại! Đã có lỗi xảy ra! Vui lòng thử lại sau!",
                form.Thang.ToString("0#"), form.Nam);
            return false;
        }

        public bool ThemNhanVienVaoBangChamCong(NhanVienTrongBangChamCongForm form)
        {
            var objBangChamCong = GetBangChamCongByIdBangChamCong(form.Id);

            if (objBangChamCong == null)
            {
                form.MessageError =
                    string.Format(
                        " Thông tin bảng chấm công tháng {0}/{1} không tồn tại trong hệ thống!",
                        form.Thang.ToString("0#"), form.Nam);
                return false;
            }
            if (objBangChamCong.IsFinish)
            {
                form.IsFinish = true;
                form.MessageError =
                    string.Format(
                        "Thêm nhân viên vào bảng chấm công tháng {0}/{1} thất bại! Bảng chấm công tháng này đã được hoàn thành trước đó! Mọi thao tác liên quan đến bảng chấm công này đều không thể thực hiện được!",
                        form.Thang.ToString("0#"), form.Nam);
                return false;
            }
            if (objBangChamCong.IsLock)
            {
                form.IsLock = true;
                form.MessageError =
                    string.Format(
                        "Thêm nhân viên vào bảng chấm công tháng {0}/{1} thất bại! Bảng chấm công tháng này đã bị khóa trước đó!",
                        form.Thang.ToString("0#"), form.Nam);
                return false;
            }

            //Danh Sách Nhân Viên thêm thành công
            var lstThemThanhCong = new List<string>();
            //Danh Sách Nhân Viên đã được thêm trước đó
            var lstThemNhanVienDaDuocThemTruocDo = new List<string>();
            //Tổng số Nhân Viên thêm vào bị lỗi
            var totalError = 0;
                
            var objChamCongNgayOriginal = new CC_ChamCongNgayNhanVien();
            BuildNgayChuNhatChoChamCongNgay(objChamCongNgayOriginal, objBangChamCong.Thang, objBangChamCong.Nam);
            var lstNhanVienDuocChon = form.IdNhanVienList.Split(',').Select(p => Convert.ToInt32(p)).ToList();
            foreach (var idNhanVien in lstNhanVienDuocChon)
            {
                if (!IsExistsChamCongNgayNhanVien(objBangChamCong.ID, idNhanVien))
                {
                    var objNhanVien = GetNhanVienById(idNhanVien);
                    if (objNhanVien != null)
                    {
                        var objChamCongNgayNhanVienNew = new CC_ChamCongNgayNhanVien();
                        objChamCongNgayNhanVienNew.MaBangChamCong = objBangChamCong.ID;
                        objChamCongNgayNhanVienNew.MaNhanVien = idNhanVien;
                        CopyDataChamCongNgayNhanVien(objChamCongNgayOriginal, objChamCongNgayNhanVienNew);
                        objChamCongNgayNhanVienNew = AddChamCongNgayNhanVien(objChamCongNgayNhanVienNew);
                        if (objChamCongNgayNhanVienNew != null)
                        {
                            lstThemThanhCong.Add(string.Format("{0} ({1})", GhepHoVaTen(objNhanVien.Ho, objNhanVien.Ten),
                                                               objNhanVien.SoThe));
                        }
                        else
                            totalError++;
                    }
                    else
                        totalError++;
                }
                else
                {
                    var objNhanVienDaTonTai = GetNhanVienById(idNhanVien);
                    if (objNhanVienDaTonTai != null)
                    {
                        lstThemNhanVienDaDuocThemTruocDo.Add(string.Format("{0} ({1})", objNhanVienDaTonTai.Ho,
                                                                           objNhanVienDaTonTai.SoThe));
                    }
                    else
                        totalError++;
                }
            }

            if (lstThemNhanVienDaDuocThemTruocDo.Count > 0)
            {
                form.MessageError = string.Format(
                    "<div>Có <b>{0}</b> nhân viên không thể thêm vào bảng chấm công tháng <b>{1}/{2}</b>, những nhân viên này đã được thêm vào trước đó:</div>",
                    lstThemNhanVienDaDuocThemTruocDo.Count, form.Thang.ToString("0#"), form.Nam);
                foreach (var nhanvien in lstThemNhanVienDaDuocThemTruocDo)
                {
                    form.MessageError += string.Format("<div> - {0}</div>", nhanvien);
                }
            }
            if (totalError > 0)
            {
                form.MessageError += string.Format(
                    "<div>Có <b>{0}</b> nhân viên không thể vào bảng chấm công tháng <b>{1}/{2}</b>! Có thể là những Nhân Viên này không tồn tại hay đã bị xóa trước đó!</div>",
                    totalError, form.Thang.ToString("0#"), form.Nam);
            }
            if (lstThemThanhCong.Count > 0)
            {
                form.MessageSuccess = string.Format(
                    "<div>Thêm thành công <b>{0}</b> nhân viên vào bảng chấm công tháng <b>{1}/{2}</b>:</div>",
                    lstThemThanhCong.Count, form.Thang.ToString("0#"), form.Nam);
                foreach (var nhanvien in lstThemThanhCong)
                {
                    form.MessageSuccess += string.Format("<div> - {0}</div>", nhanvien);
                }
                return true;
            }

            return false;
        }

        public bool XoaNhanVienKhoiBangChamCong(NhanVienTrongBangChamCongForm form)
        {
            var objBangChamCong = GetBangChamCongByIdBangChamCong(form.Id);

            if (objBangChamCong == null)
            {
                form.MessageError =
                    string.Format(
                        " Thông tin bảng chấm công tháng {0}/{1} không tồn tại trong hệ thống!",
                        form.Thang.ToString("0#"), form.Nam);
                return false;
            }
            if (objBangChamCong.IsFinish)
            {
                form.IsFinish = true;
                form.MessageError =
                    string.Format(
                        "Xóa nhân viên khỏi bảng chấm công tháng {0}/{1} thất bại! Bảng chấm công tháng này đã được hoàn thành trước đó! Mọi thao tác liên quan đến bảng chấm công này đều không thể thực hiện được!",
                        form.Thang.ToString("0#"), form.Nam);
                return false;
            }
            if (objBangChamCong.IsLock)
            {
                form.IsLock = true;
                form.MessageError =
                    string.Format(
                        "Xóa nhân viên khỏi bảng chấm công tháng {0}/{1} thất bại! Bảng chấm công tháng này đã bị khóa trước đó!",
                        form.Thang.ToString("0#"), form.Nam);
                return false;
            }

            //Danh Sách Nhân Viên xóa thành công
            var lstXoaThanhCong = new List<string>();
            //Danh Sách Nhân Viên đã được xóa trước đó
            var lstXoaNhanVienDaDuocXoaTruocDo = new List<string>();
            //Tổng số Nhân Viên xóa bị lỗi
            var totalError = 0;

            var objChamCongNgayOriginal = new CC_ChamCongNgayNhanVien();

            var lstNhanVienDuocChon = form.IdNhanVienList.Split(',').Select(p => Convert.ToInt32(p)).ToList();
            foreach (var idNhanVien in lstNhanVienDuocChon)
            {
                if (IsExistsChamCongNgayNhanVien(objBangChamCong.ID, idNhanVien))
                {
                    var objNhanVien = GetNhanVienById(idNhanVien);
                    if (objNhanVien != null)
                    {
                        var objChamCongNgayNhanVienDelete =
                                        GetChamCongNgayNhanVienByIdBangChamCongVaIdNhanVien(objBangChamCong.ID, idNhanVien);
                        if (DeleteChamCongNgayNhanVien(objChamCongNgayNhanVienDelete))
                        {
                            lstXoaThanhCong.Add(string.Format("{0} ({1})", GhepHoVaTen(objNhanVien.Ho, objNhanVien.Ten),
                                                              objNhanVien.SoThe));
                        } 
                        else
                            totalError++;
                    }
                    else
                        totalError++;
                }
                else
                {
                    //Nhân Viên này không tồn tại trong bảng Chấm Công Ngày hay đã bị xóa trước đó!
                    var objNhanVien = GetNhanVienById(idNhanVien);
                    if (objNhanVien != null)
                    {
                        lstXoaNhanVienDaDuocXoaTruocDo.Add(string.Format("{0} ({1})",
                                                                         GhepHoVaTen(objNhanVien.Ho, objNhanVien.Ten),
                                                                         objNhanVien.SoThe));
                    }
                    else
                        totalError++;
                }
            }

            if (lstXoaNhanVienDaDuocXoaTruocDo.Count > 0)
            {
                form.MessageError = string.Format(
                    "<div>Có <b>{0}</b> nhân viên không thể xóa khỏi bảng chấm công tháng <b>{1}/{2}</b>, những nhân viên này đã được xóa khỏi bảng chấm công trước đó:</div>",
                    lstXoaNhanVienDaDuocXoaTruocDo.Count, form.Thang.ToString("0#"), form.Nam);
                foreach (var nhanvien in lstXoaNhanVienDaDuocXoaTruocDo)
                {
                    form.MessageError += string.Format("<div> - {0}</div>", nhanvien);
                }
            }
            if (totalError > 0)
            {
                form.MessageError += string.Format(
                    "<div>Có <b>{0}</b> nhân viên không thể xóa khỏi bảng chấm công tháng <b>{1}/{2}</b>! Có thể là những Nhân Viên này không tồn tại hay đã bị xóa trước đó!</div>",
                    totalError, form.Thang.ToString("0#"), form.Nam);
            }
            if (lstXoaThanhCong.Count > 0)
            {
                form.MessageSuccess = string.Format(
                    "<div>Xóa thành công <b>{0}</b> nhân viên khỏi bảng chấm công tháng <b>{1}/{2}</b>:</div>",
                    lstXoaThanhCong.Count, form.Thang.ToString("0#"), form.Nam);
                foreach (var nhanvien in lstXoaThanhCong)
                {
                    form.MessageSuccess += string.Format("<div> - {0}</div>", nhanvien);
                }
                return true;
            }
            return false;
        }

        public bool LuuChamCongNhanVien(ChamCongHomNayForm form)
        {
            if (!IsExistsBangChamCongByIdBangChamCong(form.Id))
            {
                form.MessageError =
                    string.Format(
                        "Lưu thất bại! Bảng chấm công tháng {0}/{1} không tồn tại hoặc đã bị xóa trước đó! Không thể lưu chấm công của ngày '{2}'!",
                        form.Thang.ToString("0#"), form.Nam,
                        form.Ngay.ToString("0#") + "/" + form.Thang.ToString("0#") + "/" + form.Nam);
                return false;
            }
            if (!IsDuocPhepChinhSuaBangChamCongByIdBangChamCong(form.Id))
            {
                form.MessageError =
                    string.Format(
                        "Lưu thất bại! Thông tin bảng chấm công tháng {0}/{1} đã bị khóa hoặc đã hoàn thành trước đó! Không thể lưu chấm công của ngày '{2}'!",
                        form.Thang.ToString("0#"), form.Nam,
                        form.Ngay.ToString("0#") + "/" + form.Thang.ToString("0#") + "/" + form.Nam);
                return false;
            }
            var objBangChamCong = GetBangChamCongByIdBangChamCong(form.Id);
            form.NgayChamCong = _commonDelegate.ConvertToDateTime(form.Ngay, objBangChamCong.Thang, objBangChamCong.Nam);
            form.IsToday = _commonDelegate.DateTimeIsEqual(form.NgayChamCong, DateTime.Today);
            form.DayOfWeek = _commonDelegate.GetDayOfWeek(form.NgayChamCong);

            var lstNhanVien = form.IdNhanVienList.Split(',').Select(p => Convert.ToInt32(p));

            var lstChamCongNhanVien =
                QueryGetAllChamCongNgayNhanVien().Where(
                    p => p.MaBangChamCong == objBangChamCong.ID && lstNhanVien.Contains(p.MaNhanVien));

            using (var transaction = new System.Transactions.TransactionScope())
            {
                try
                {
                    if (form.IsChamCongNgay && form.IsChamTangCa)
                    {
                        //Thực hiện Chấm Công và Lưu Số Giờ Tăng Ca
                        foreach (var ccChamCongNgayNhanVien in lstChamCongNhanVien)
                        {
                            BuildUpdateChamCongNgayNhanVien(ccChamCongNgayNhanVien, form.Ngay, form.KyHieuChamCong,
                                                            (byte)form.SoGioTangCa);
                        }
                    }
                    else
                    {
                        if (form.IsChamTangCa)
                        {
                            //Thực hiện Lưu Số Giờ Tăng Ca
                            foreach (var ccChamCongNgayNhanVien in lstChamCongNhanVien)
                            {
                                BuildUpdateChamCongNgayNhanVien(ccChamCongNgayNhanVien, form.Ngay,
                                                                (byte) form.SoGioTangCa);
                            }
                        }

                        if (form.IsChamCongNgay)
                        {
                            //Chỉ Thực hiện Lưu Chấm Công
                            foreach (var ccChamCongNgayNhanVien in lstChamCongNhanVien)
                            {
                                BuildUpdateChamCongNgayNhanVien(ccChamCongNgayNhanVien, form.Ngay, form.KyHieuChamCong);
                            }
                        }
                    }

                    _dBChamCong.SubmitChanges();
                    transaction.Complete();
                    transaction.Dispose();

                    form.MessageSuccess =
                        string.Format(
                            "Lưu thông tin chấm công ngày {0}/{1}/{2} thành công!",
                            form.Ngay.ToString("0#"), objBangChamCong.Thang.ToString("0#"), objBangChamCong.Nam);

                    return true;
                }
                catch (Exception)
                {
                    form.MessageError = string.Format(
                        "Lưu thông tin chấm công ngày {0}/{1}/{2} thất bại! Đã có lỗi xảy ra! Vui lòng thử lại sau!",
                        form.Ngay.ToString("0#"), objBangChamCong.Thang.ToString("0#"), objBangChamCong.Nam);
                    return false;
                }
            }
        }

        public bool TinhTongHopVaLuuLaiDuLieuChamCongByIdBangChamCong(int idBangChamCong)
        {
            //Bảng Chấm Công Của Tháng
            var objBangChamCong = GetBangChamCongByIdBangChamCong(idBangChamCong);
            //Nếu Bảng Chấm Công Không Tồn Tại Hay Đã Bị Khóa Hay Đã Hoàn Thành thì không thể tiếp tục
            if (objBangChamCong == null || objBangChamCong.IsLock == true || objBangChamCong.IsFinish == true)
                return false;

            //Số Ngày Thiếu của Tháng
            int soNgayThieu = GetSoNgayThieu(objBangChamCong.Thang, objBangChamCong.Nam);

            var lstChamCongNhanVien = GetListChamCongNgayNhanVienByIdBangChamCong(idBangChamCong);

            foreach (var ccnhanvien in lstChamCongNhanVien)
            {
                ccnhanvien.TongThuViec = Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "TV"))
                    + Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "NV"));
                ccnhanvien.TongNghiKhamThai = Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "KT"));
                ccnhanvien.TongNghiCoPhep = Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "CP"));
                ccnhanvien.TongNghiKhongPhep = Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "KP"));
                ccnhanvien.TongNghiConBenh = Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "CB"));
                ccnhanvien.TongNghiBenh = Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "B"));
                ccnhanvien.TongNghiThaiSan = Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "TS"));
                ccnhanvien.TongNghiPhepNam = CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "PN")
                    + CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "PN/2") /2;
                ccnhanvien.TongNghiCheDo = Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "TNLĐ"))
                    + Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "C"))
                    + Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "TC"));
                ccnhanvien.TongNghiLe = Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "L"));
                ccnhanvien.TongNghiKhongCoViec = Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "KV"));
                ccnhanvien.TongSoGioTangCa = GetTongSoGioTangCaByChamCongNgay(ccnhanvien);
                ccnhanvien.TongVangMat = ccnhanvien.TongNghiKhamThai + ccnhanvien.TongNghiCoPhep + ccnhanvien.TongNghiKhongPhep + ccnhanvien.TongNghiConBenh + ccnhanvien.TongNghiBenh
                    + ccnhanvien.TongNghiThaiSan + ccnhanvien.TongNghiPhepNam + ccnhanvien.TongNghiKhongCoViec;
                ccnhanvien.TongSoNgayLamViec = CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "NC")
                    + CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "NC/2") / 2
                    + CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "NC*2") * 2
                    + CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "NC*3") * 3
                    + soNgayThieu;
            }
            _dBChamCong.SubmitChanges();

            return true;
        }

        public bool TinhTongHopVaLuuLaiDuLieuChamCongByThangNamVaIdNhanVien(int thang, int nam, int idNhanVien)
        {
            //Bảng Chấm Công Của Tháng
            var objBangChamCong = GetBangChamCongByThangNam(thang, nam);
            //Nếu Bảng Chấm Công Không Tồn Tại Hay Đã Bị Khóa Hay Đã Hoàn Thành thì không thể tiếp tục
            if (objBangChamCong == null || objBangChamCong.IsLock == true || objBangChamCong.IsFinish == true)
                return false;

            //Số Ngày Thiếu của Tháng
            int soNgayThieu = GetSoNgayThieu(objBangChamCong.Thang, objBangChamCong.Nam);

            var ccnhanvien = GetChamCongNgayNhanVienByIdBangChamCongVaIdNhanVien(objBangChamCong.ID, idNhanVien);

            ccnhanvien.TongThuViec = Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "TV"))
                + Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "NV"));
            ccnhanvien.TongNghiKhamThai = Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "KT"));
            ccnhanvien.TongNghiCoPhep = Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "CP"));
            ccnhanvien.TongNghiKhongPhep = Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "KP"));
            ccnhanvien.TongNghiConBenh = Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "CB"));
            ccnhanvien.TongNghiBenh = Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "B"));
            ccnhanvien.TongNghiThaiSan = Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "TS"));
            ccnhanvien.TongNghiPhepNam = CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "PN")
                + CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "PN/2") / 2;
            ccnhanvien.TongNghiCheDo = Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "TNLĐ"))
                + Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "C"))
                + Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "TC"));
            ccnhanvien.TongNghiLe = Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "L"));
            ccnhanvien.TongNghiKhongCoViec = Convert.ToByte(CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "KV"));
            ccnhanvien.TongSoGioTangCa = GetTongSoGioTangCaByChamCongNgay(ccnhanvien);
            ccnhanvien.TongVangMat = ccnhanvien.TongNghiKhamThai + ccnhanvien.TongNghiCoPhep + ccnhanvien.TongNghiKhongPhep + ccnhanvien.TongNghiConBenh + ccnhanvien.TongNghiBenh
                + ccnhanvien.TongNghiThaiSan + ccnhanvien.TongNghiPhepNam + ccnhanvien.TongNghiKhongCoViec;
            ccnhanvien.TongSoNgayLamViec = CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "NC")
                + CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "NC/2") / 2
                + CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "NC*2") * 2
                + CountTongHopChamCongNgayByChamCongNgayVaKyHieuChamCong(ccnhanvien, "NC*3") * 3
                + soNgayThieu;

            _dBChamCong.SubmitChanges();

            return true;
        }

        public void LuuChamCongThoiViec(int idNhanVien, DateTime ngayNghiViec)
        {
            CC_ChamCongNgayNhanVien objChamCongNgayNhanVien = GetChamCongNgayNhanVienByThangNamVaIdNhanVien(ngayNghiViec.Month, ngayNghiViec.Year, idNhanVien);

            if (ngayNghiViec.Day <= 1 && !_commonDelegate.DateIsSunday(1, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N1 = "NVCLV";
            if (ngayNghiViec.Day <= 2 && !_commonDelegate.DateIsSunday(2, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N2 = "NVCLV";
            if (ngayNghiViec.Day <= 3 && !_commonDelegate.DateIsSunday(3, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N3 = "NVCLV";
            if (ngayNghiViec.Day <= 4 && !_commonDelegate.DateIsSunday(4, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N4 = "NVCLV";
            if (ngayNghiViec.Day <= 5 && !_commonDelegate.DateIsSunday(5, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N5 = "NVCLV";
            if (ngayNghiViec.Day <= 6 && !_commonDelegate.DateIsSunday(6, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N6 = "NVCLV";
            if (ngayNghiViec.Day <= 7 && !_commonDelegate.DateIsSunday(7, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N7 = "NVCLV";
            if (ngayNghiViec.Day <= 8 && !_commonDelegate.DateIsSunday(8, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N8 = "NVCLV";
            if (ngayNghiViec.Day <= 9 && !_commonDelegate.DateIsSunday(9, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N9 = "NVCLV";
            if (ngayNghiViec.Day <= 10 && !_commonDelegate.DateIsSunday(10, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N10 = "NVCLV";
            if (ngayNghiViec.Day <= 11 && !_commonDelegate.DateIsSunday(11, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N11 = "NVCLV";
            if (ngayNghiViec.Day <= 12 && !_commonDelegate.DateIsSunday(12, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N12 = "NVCLV";
            if (ngayNghiViec.Day <= 13 && !_commonDelegate.DateIsSunday(13, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N13 = "NVCLV";
            if (ngayNghiViec.Day <= 14 && !_commonDelegate.DateIsSunday(14, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N14 = "NVCLV";
            if (ngayNghiViec.Day <= 15 && !_commonDelegate.DateIsSunday(15, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N15 = "NVCLV";
            if (ngayNghiViec.Day <= 16 && !_commonDelegate.DateIsSunday(16, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N16 = "NVCLV";
            if (ngayNghiViec.Day <= 17 && !_commonDelegate.DateIsSunday(17, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N17 = "NVCLV";
            if (ngayNghiViec.Day <= 18 && !_commonDelegate.DateIsSunday(18, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N18 = "NVCLV";
            if (ngayNghiViec.Day <= 19 && !_commonDelegate.DateIsSunday(19, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N19 = "NVCLV";
            if (ngayNghiViec.Day <= 20 && !_commonDelegate.DateIsSunday(20, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N20 = "NVCLV";
            if (ngayNghiViec.Day <= 21 && !_commonDelegate.DateIsSunday(21, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N21 = "NVCLV";
            if (ngayNghiViec.Day <= 22 && !_commonDelegate.DateIsSunday(22, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N22 = "NVCLV";
            if (ngayNghiViec.Day <= 23 && !_commonDelegate.DateIsSunday(23, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N23 = "NVCLV";
            if (ngayNghiViec.Day <= 24 && !_commonDelegate.DateIsSunday(24, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N24 = "NVCLV";
            if (ngayNghiViec.Day <= 25 && !_commonDelegate.DateIsSunday(25, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N25 = "NVCLV";
            if (ngayNghiViec.Day <= 26 && !_commonDelegate.DateIsSunday(26, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N26 = "NVCLV";
            if (ngayNghiViec.Day <= 27 && !_commonDelegate.DateIsSunday(27, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N27 = "NVCLV";
            if (ngayNghiViec.Day <= 28 && !_commonDelegate.DateIsSunday(28, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N28 = "NVCLV";
            if (ngayNghiViec.Day <= 29 && !_commonDelegate.DateIsSunday(29, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N29 = "NVCLV";
            if (ngayNghiViec.Day <= 30 && !_commonDelegate.DateIsSunday(30, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N30 = "NVCLV";
            if (ngayNghiViec.Day <= 31 && !_commonDelegate.DateIsSunday(31, ngayNghiViec.Month, ngayNghiViec.Year))
                objChamCongNgayNhanVien.N31 = "NVCLV";
            _dBChamCong.SubmitChanges();
        }

        #endregion

        #region Build

        public BangChamCongForm BuildBangChamCongForm(CC_BangChamCong obj)
        {
            var form = new BangChamCongForm();
            form.Id = obj.ID;
            form.Thang = obj.Thang;
            form.Nam = obj.Nam;
            form.HoTenNguoiLapBieu = obj.HoTenNguoiLapBieu;
            form.HoTenNguoiKy = obj.HoTenNguoiKy;
            form.ChucVuNguoiKy = obj.ChucVuNguoiKy;
            form.NgayKy = _commonDelegate.ConvertDateTimeToString(obj.NgayKy);
            form.GhiChu = obj.GhiChu;
            form.NguoiTao = obj.NguoiTao;
            form.NgayTao = _commonDelegate.ConvertDateTimeToString(obj.NgayTao);
            form.NguoiSua = obj.NguoiSua;
            form.NgaySua = _commonDelegate.ConvertDateTimeToString(obj.NgaySua);
            form.IsLock = obj.IsLock;
            form.IsFinish = obj.IsFinish;

            form.HoTenNguoiTao = _commonDelegate.GetDisplayNameByUserId(Convert.ToString(obj.NguoiTao));
            form.HoTenNguoiSua = _commonDelegate.GetDisplayNameByUserId(Convert.ToString(obj.NguoiSua));
            return form;
        }

        public CC_BangChamCong BuildBangChamCongLinQ(BangChamCongForm form)
        {
            var obj = new CC_BangChamCong();
            if (form.Id > 0)
            {
                obj = GetBangChamCongByIdBangChamCong(form.Id);
            }
            obj.ID = form.Id;
            obj.Thang = (byte) form.Thang;
            obj.Nam = (short) form.Nam;
            obj.HoTenNguoiLapBieu = !string.IsNullOrEmpty(form.HoTenNguoiLapBieu)
                                        ? form.HoTenNguoiLapBieu.Trim()
                                        : string.Empty;
            obj.HoTenNguoiKy = !string.IsNullOrEmpty(form.HoTenNguoiKy)
                                   ? form.HoTenNguoiKy.Trim()
                                   : string.Empty;
            obj.ChucVuNguoiKy = !string.IsNullOrEmpty(form.ChucVuNguoiKy)
                                    ? form.ChucVuNguoiKy.Trim()
                                    : string.Empty;
            obj.NgayKy = _commonDelegate.ConvertStringToDateTime(form.NgayKy);
            obj.GhiChu = !string.IsNullOrEmpty(form.GhiChu)
                             ? form.GhiChu.Trim()
                             : string.Empty;
            return obj;
        }

        public BangChamCongForm BuildBangChamCongFormByIdBangChamCong(int idBangChamCong)
        {
            var form = new BangChamCongForm();
            CC_BangChamCong obj = GetBangChamCongByIdBangChamCong(idBangChamCong);
            if (obj != null)
            {
                form.Id = obj.ID;
                form.Thang = obj.Thang;
                form.Nam = obj.Nam;
                form.HoTenNguoiLapBieu = obj.HoTenNguoiLapBieu;
                form.HoTenNguoiKy = obj.HoTenNguoiKy;
                form.ChucVuNguoiKy = obj.ChucVuNguoiKy;
                form.NgayKy = _commonDelegate.ConvertDateTimeToString(obj.NgayKy);
                form.GhiChu = obj.GhiChu;
                form.NguoiTao = obj.NguoiTao;
                form.NgayTao = _commonDelegate.ConvertDateTimeToString(obj.NgayTao);
                form.NguoiSua = obj.NguoiSua;
                form.NgaySua = _commonDelegate.ConvertDateTimeToString(obj.NgaySua);
                form.IsLock = obj.IsLock;
                form.IsFinish = obj.IsFinish;

                form.HoTenNguoiTao = _commonDelegate.GetDisplayNameByUserId(Convert.ToString(obj.NguoiTao));
                form.HoTenNguoiSua = _commonDelegate.GetDisplayNameByUserId(Convert.ToString(obj.NguoiSua));
            }
            return form;
        }

        /// <summary>
        /// Build List Bảng Chấm Công Form theo Năm
        /// </summary>
        /// <param name="nam">Năm</param>
        /// <returns>Danh Sách Bảng Chấm Công Trong Năm hoặc Danh Sách Tất cả Bảng Chấm Công nếu nam == null</returns>
        public IList<BangChamCongForm> BuildListBangChamCongForm(int? nam)
        {
            var listBangChamCong = GetListBangChamCongByNam(nam);

            return listBangChamCong.Select(objBangChamCong => BuildBangChamCongForm(objBangChamCong)).ToList();
        }

        /// <summary>
        /// Build Select List Các Năm có trong Bảng Chấm Công
        /// </summary>
        /// <returns></returns>
        public SelectList BuildSelectListNamTrongBangChamCong()
        {
            var listNam = GetAllNamTrongBangChamCong();

            return new SelectList(listNam.Select(p => new {Value = p, Text = p}), "Value", "Text");
        }

        /// <summary>
        /// Build Select List Các Năm để phục vụ cho việc Tạo Bảng Chấm Công Mới
        /// </summary>
        /// <returns></returns>
        public SelectList BuildSelectListNamDeTaoBangChamCong()
        {
            var maxNam = DateTime.Today.Year;
            var minNam = DateTime.Today.Year - 5;
            var listNam = new List<int>();
            for (var indexNam = minNam; indexNam <= maxNam; indexNam++)
            {
                listNam.Add(indexNam);
            }

            return new SelectList(listNam.OrderByDescending(p => p).Select(p => new {Value = p, Text = p}), "Value",
                                  "Text");
        }

        /// <summary>
        /// Build Select List Các Tháng chưa có bảng chấm công trong Năm để phục vụ cho việc Tạo Bảng Chấm Công Mới
        /// </summary>
        /// <returns></returns>
        public SelectList BuildSelectListThangChuaCoBangChamCongTrongNamDeTaoBangChamCong(int nam)
        {
            var listThangChuaTonTai = GetThangChuaCoBangChamCongTrongNam(nam);

            return new SelectList(listThangChuaTonTai.OrderBy(p => p).Select(p => new {Value = p, Text = p}),
                                  "Value",
                                  "Text");
        }

        public BaseNhanVienTrongChamCong BuildBaseNhanVienTrongChamCong(hs_NhanVien obj)
        {
            var baseNhanVien = new BaseNhanVienTrongChamCong();
            baseNhanVien.IdNhanVien = obj.Id;
            baseNhanVien.TrangThai = obj.TrangThai;
            baseNhanVien.SoThe = obj.SoThe;
            baseNhanVien.HoTen = GhepHoVaTen(obj.Ho, obj.Ten);
            baseNhanVien.Ho = !string.IsNullOrEmpty(obj.Ho) ? obj.Ho.Trim() : string.Empty;
            baseNhanVien.Ten = !string.IsNullOrEmpty(obj.Ten) ? obj.Ten.Trim() : string.Empty;
            baseNhanVien.GioiTinh = obj.GioiTinh ?? false;
            baseNhanVien.TenGioiTinh = obj.GioiTinh == true ? "Nữ" : "Nam";
            baseNhanVien.NgaySinh = _commonDelegate.ConvertDateTimeToString(obj.NamSinh);
            baseNhanVien.PhongBan = Convert.ToString(obj.IdPhongBan);
            baseNhanVien.ChucVu = obj.IdChucVu != null ? obj.TB_JobTitle.JobTitle : ""; //Convert.ToString(obj.IdChucVu);
            return baseNhanVien;
        }

        public BaseThongTinNhanVien BuildBaseThongTinNhanVien(hs_NhanVien obj)
        {
            var baseNhanVien = new BaseThongTinNhanVien();
            baseNhanVien.IdNhanVien = obj.Id;
            baseNhanVien.TrangThai = obj.TrangThai;
            baseNhanVien.SoThe = obj.SoThe;
            baseNhanVien.HoTen = GhepHoVaTen(obj.Ho, obj.Ten);
            baseNhanVien.Ho = !string.IsNullOrEmpty(obj.Ho) ? obj.Ho.Trim() : string.Empty;
            baseNhanVien.Ten = !string.IsNullOrEmpty(obj.Ten) ? obj.Ten.Trim() : string.Empty;
            baseNhanVien.GioiTinh = obj.GioiTinh ?? false;
            baseNhanVien.TenGioiTinh = obj.GioiTinh == true ? "Nữ" : "Nam";
            baseNhanVien.NgaySinh = _commonDelegate.ConvertDateTimeToString(obj.NamSinh);
            baseNhanVien.PhongBan = Convert.ToString(obj.IdPhongBan);
            baseNhanVien.ChucVu = Convert.ToString(obj.IdChucVu);
            return baseNhanVien;
        }

        public void BuildDuLieuChamCongTrongBaseNhanVienTrongChamCong(BaseNhanVienTrongChamCong objNhanVien, CC_ChamCongNgayNhanVien objChamCong)
        {
            objNhanVien.ListDuLieuChamCongTrongThang = GetChamCongNgayVaTangCaByChamCongNgay(objChamCong);
        }

        public void BuildThongTinChamCongTrongChamCongHomNayForm(ChamCongHomNayForm form,CC_BangChamCong objBangChamCong)
        {
            form.Id = objBangChamCong.ID;
            form.Thang = objBangChamCong.Thang;
            form.Nam = objBangChamCong.Nam;
            form.IsLock = objBangChamCong.IsLock;
            form.IsFinish = objBangChamCong.IsFinish;
        }

        public void BuildSearchNhanVien(NhanVienTrongBangChamCongForm form)
        {
            var objBangChamCong = GetBangChamCongByIdBangChamCong(form.Id);
            form.Thang = objBangChamCong.Thang;
            form.Nam = objBangChamCong.Nam;
            form.IsLock = objBangChamCong.IsLock;
            form.IsFinish = objBangChamCong.IsFinish;

            //Danh sách Mã Nhân Viên có trong Bảng Chấm Công Ngày
            //var lstMaNhanVienTrongBangChamCong = GetAllMaNhanVienTrongChamCongNgayByIdBangChamCong(form.Id).ToList();
            var lstMaNhanVienTrongBangChamCong = GetAllMaNhanVienTrongChamCongNgayByIdBangChamCongOrderByTen(form.Id).ToList();

            //Danh sách Mã Nhân Viên Không có trong Bảng Chấm Công Ngày
            var lstMaNhanVienKhongCoTrongBangChamCong =
                QueryGetAllMaNhanVien().Where(p => !lstMaNhanVienTrongBangChamCong.Contains(p)).ToList();

            var lstNhanVienCoTrongBangChamCong = QueryGetSearchNhanVienTrongChamCongNgay(
                lstMaNhanVienTrongBangChamCong, form.TieuChiMot, form.GiaTriMot).OrderBy(
                    p => p.Ten.Trim());

            form.TotalItem = lstNhanVienCoTrongBangChamCong.Count();

            if (form.TotalItem % form.ItemsPerPage == 0)
                form.TotalPage = form.TotalItem / form.ItemsPerPage;
            else
                form.TotalPage = (form.TotalItem / form.ItemsPerPage) + 1;

            var lstCoDaSapXep =
                lstNhanVienCoTrongBangChamCong.Skip((form.PageIndex - 1) * form.ItemsPerPage).Take(form.ItemsPerPage);

            form.ListNhanVienCoTrongBangChamCong = new List<NhanVienTrongBangChamCongForm>();
            foreach (var hsNhanVien in lstCoDaSapXep)
            {
                form.ListNhanVienCoTrongBangChamCong.Add(
                    new NhanVienTrongBangChamCongForm(BuildBaseNhanVienTrongChamCong(hsNhanVien)));
            }

            #region Nhân viên không có trong Bảng Chấm Công Ngày
            var lstNhanVienKhongCoTrongBangChamCong =
                QueryGetAllNhanVien().Where(p => lstMaNhanVienKhongCoTrongBangChamCong.Contains(p.Id)).OrderBy(
                    p => p.Ten.Trim());
            form.ListNhanVienKhongCoTrongBangChamCong = new List<NhanVienTrongBangChamCongForm>();
            foreach (var hsNhanVien in lstNhanVienKhongCoTrongBangChamCong)
            {
                form.ListNhanVienKhongCoTrongBangChamCong.Add(
                    new NhanVienTrongBangChamCongForm(BuildBaseNhanVienTrongChamCong(hsNhanVien)));
            }
            #endregion

        }

        public void BuildDanhSachNhanVienTrongChamCongNgay(ChamCongHomNayForm form)
        {
            //Lấy tất cả nhân viên trong bảng chấm công
            //var lstChamCongNhanVien = GetListChamCongNgayNhanVienByIdBangChamCong(form.Id);
            var totalItem = 0;
            var totalPage = 0;
            //Lấy tất cả nhân viên trong bảng chấm công (Phân trang)
            //var lstChamCongNhanVien = GetListChamCongNgayNhanVienByIdBangChamCongOrderByTen(form.Id, form.PageIndex, form.ItemPerPage, ref totalItem, ref totalPage);
            //Tìm Kiếm nhân viên trong bảng chấm công
            var lstChamCongNhanVien = SearchChamCongNgayNhanVienByIdBangChamCongOrderByTen(
                                        form.Id, form.SearchByIdPhongBan, form.SearchByIdChucVu, form.SearchByHoTen,
                                        form.PageIndex, form.ItemPerPage, ref totalItem, ref totalPage);
            form.TotalItem = totalItem;
            form.TotalPage = totalPage;

            foreach (var ccChamCongNgayNhanVien in lstChamCongNhanVien)
            {
                var nhanVienForm = new ChamCongHomNayForm();
                var objNhanVien = GetNhanVienById(ccChamCongNgayNhanVien.MaNhanVien);
                if (objNhanVien != null)
                {
                    nhanVienForm.NhanVien = BuildBaseNhanVienTrongChamCong(objNhanVien);
                    //Dữ liệu chấm công của ngày muốn chấm công
                    nhanVienForm.NhanVien.ChamCongHomNay =
                        GetChamCongNgayVaTangCaByThangNamVaIdNhanVienVaNgay(form.Thang, form.Nam,
                                                                            ccChamCongNgayNhanVien.MaNhanVien, form.Ngay);
                    //Build Dữ liệu chấm công của nhân viên trong một tháng
                    BuildDuLieuChamCongTrongBaseNhanVienTrongChamCong(nhanVienForm.NhanVien, ccChamCongNgayNhanVien);
                    form.ListNhanVienTrongBangChamCong.Add(nhanVienForm);
                }
            }
        }

        public BaseBangChamCong BuildBaseBangChamCong(CC_BangChamCong objBangChamCong)
        {
            var result = new BaseBangChamCong();
            result.Id = objBangChamCong.ID;
            result.Thang = objBangChamCong.Thang;
            result.Nam = objBangChamCong.Nam;
            result.HoTenNguoiLapBieu = objBangChamCong.HoTenNguoiLapBieu;
            result.HoTenNguoiKy = objBangChamCong.HoTenNguoiKy;
            result.ChucVuNguoiKy = objBangChamCong.ChucVuNguoiKy;
            result.NgayKy = _commonDelegate.ConvertDateTimeToString(objBangChamCong.NgayKy);
            result.GhiChu = objBangChamCong.GhiChu;
            result.NguoiTao = objBangChamCong.NguoiTao;
            result.NgayTao = _commonDelegate.ConvertDateTimeToString(objBangChamCong.NgayTao);
            result.NguoiSua = objBangChamCong.NguoiSua;
            result.NgaySua = _commonDelegate.ConvertDateTimeToString(objBangChamCong.NgaySua);
            result.IsLock = objBangChamCong.IsLock;
            result.IsFinish = objBangChamCong.IsFinish;

            //Extend
            //result.HoTenNguoiTao = objBangChamCong.HoTenNguoiTao;
            //result.HoTenNguoiSua = objBangChamCong.HoTenNguoiSua;

            return result;
        }

        public void BuildTongHopChamCongNgay(TongHopChamCongForm form)
        {
            var totalItem = 0;
            var totalPage = 0;
            var lstChamCongNhanVien = GetListChamCongNgayNhanVienByIdBangChamCongOrderByTen(form.Id, form.PageIndex, form.ItemPerPage, ref totalItem, ref totalPage);
            form.TotalItem = totalItem;
            form.TotalPage = totalPage;
            var ListChamCongNgayNhanVienForm = new List<ChamCongNgayNhanVienForm>();

            foreach (var ccChamCongNgayNhanVien in lstChamCongNhanVien)
            {
                var ccnhanVienForm = new ChamCongNgayNhanVienForm();
                var objNhanVien = GetNhanVienById(ccChamCongNgayNhanVien.MaNhanVien);
                if (objNhanVien != null)
                {
                    //Build Thông Tin Cá Nhân
                    ccnhanVienForm.ThongTinCaNhan = BuildBaseThongTinNhanVien(objNhanVien);

                    ////Build Dữ liệu chấm công của nhân viên trong một tháng
                    ccnhanVienForm.ListChamCongNgay = GetChamCongNgayVaTangCaByChamCongNgay(ccChamCongNgayNhanVien);
                    ccnhanVienForm.TongThuViec = Convert.ToByte(ccChamCongNgayNhanVien.TongThuViec);
                    ccnhanVienForm.TongNghiKhamThai = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiKhamThai);
                    ccnhanVienForm.TongNghiCoPhep = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiCoPhep);
                    ccnhanVienForm.TongNghiKhongPhep = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiKhongPhep);
                    ccnhanVienForm.TongNghiConBenh = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiConBenh);
                    ccnhanVienForm.TongNghiBenh = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiBenh);
                    ccnhanVienForm.TongNghiThaiSan = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiThaiSan);
                    ccnhanVienForm.TongNghiThaiSan = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiThaiSan);
                    ccnhanVienForm.TongNghiPhepNam = ccChamCongNgayNhanVien.TongNghiPhepNam;
                    ccnhanVienForm.TongNghiCheDo = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiCheDo);
                    ccnhanVienForm.TongNghiLe = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiLe);
                    ccnhanVienForm.TongNghiKhongCoViec = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiKhongCoViec);
                    ccnhanVienForm.TongSoGioTangCa = Convert.ToByte(ccChamCongNgayNhanVien.TongSoGioTangCa);
                    ccnhanVienForm.TongVangMat = Convert.ToByte(ccChamCongNgayNhanVien.TongVangMat);
                    ccnhanVienForm.TongSoNgayLamViec = ccChamCongNgayNhanVien.TongSoNgayLamViec;
                    ccnhanVienForm.TongCaDem = ccChamCongNgayNhanVien.TongCaDem;
                    ccnhanVienForm.GhiChu = ccChamCongNgayNhanVien.GhiChu;

                    ListChamCongNgayNhanVienForm.Add(ccnhanVienForm);
                }
            }
            form.ListChamCongNhanVien = ListChamCongNgayNhanVienForm;
        }

        public void BuildTongHopChamCongNgay(ChamCongHomNayForm form)
        {
            //var lstChamCongNhanVien = GetListChamCongNgayNhanVienByIdBangChamCong(form.Id);
            var totalItem = 0;
            var totalPage = 0;
            var lstChamCongNhanVien = GetListChamCongNgayNhanVienByIdBangChamCongOrderByTen(form.Id, form.PageIndex, form.ItemPerPage, ref totalItem, ref totalPage);
            form.TotalItem = totalItem;
            form.TotalPage = totalPage;

            foreach (var ccChamCongNgayNhanVien in lstChamCongNhanVien)
            {
                var nhanVienForm = new ChamCongHomNayForm();
                var objNhanVien = GetNhanVienById(ccChamCongNgayNhanVien.MaNhanVien);
                if (objNhanVien != null)
                {
                    nhanVienForm.NhanVien = BuildBaseNhanVienTrongChamCong(objNhanVien);

                    //Build Dữ liệu chấm công của nhân viên trong một tháng
                    BuildDuLieuChamCongTrongBaseNhanVienTrongChamCong(nhanVienForm.NhanVien, ccChamCongNgayNhanVien);
                    form.ListNhanVienTrongBangChamCong.Add(nhanVienForm);
                }
            }
        }

        public ThoiViecForm BuildThoiViecNhanVien(int idNhanVien)
        {
            var form = new ThoiViecForm();
            var objNhanVien = GetNhanVienById(idNhanVien);
            if (objNhanVien != null)
            {
                //Build Thông Tin Cá Nhân
                form.IdNhanVien = objNhanVien.Id;
                form.SoThe = objNhanVien.SoThe;
                form.HoTen = GhepHoVaTen(objNhanVien.Ho, objNhanVien.Ten);

                var ccChamCongNgayNhanVien = GetChamCongNgayNhanVienByThangNamVaIdNhanVien(DateTime.Today.Month, DateTime.Today.Year, idNhanVien);
                var ccnhanVienForm = new ChamCongNgayNhanVienForm();

                ////Build Dữ liệu chấm công của nhân viên trong một tháng
                ccnhanVienForm.ListChamCongNgay = GetChamCongNgayVaTangCaByThangNamVaIdNhanVien(DateTime.Today.Month, DateTime.Today.Year, idNhanVien);
                ccnhanVienForm.TongThuViec = Convert.ToByte(ccChamCongNgayNhanVien.TongThuViec);
                ccnhanVienForm.TongNghiKhamThai = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiKhamThai);
                ccnhanVienForm.TongNghiCoPhep = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiCoPhep);
                ccnhanVienForm.TongNghiKhongPhep = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiKhongPhep);
                ccnhanVienForm.TongNghiConBenh = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiConBenh);
                ccnhanVienForm.TongNghiBenh = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiBenh);
                ccnhanVienForm.TongNghiThaiSan = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiThaiSan);
                ccnhanVienForm.TongNghiThaiSan = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiThaiSan);
                ccnhanVienForm.TongNghiPhepNam = ccChamCongNgayNhanVien.TongNghiPhepNam;
                ccnhanVienForm.TongNghiCheDo = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiCheDo);
                ccnhanVienForm.TongNghiLe = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiLe);
                ccnhanVienForm.TongNghiKhongCoViec = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiKhongCoViec);
                ccnhanVienForm.TongSoGioTangCa = Convert.ToByte(ccChamCongNgayNhanVien.TongSoGioTangCa);
                ccnhanVienForm.TongVangMat = Convert.ToByte(ccChamCongNgayNhanVien.TongVangMat);
                ccnhanVienForm.TongSoNgayLamViec = ccChamCongNgayNhanVien.TongSoNgayLamViec;
                ccnhanVienForm.TongCaDem = ccChamCongNgayNhanVien.TongCaDem;
                ccnhanVienForm.GhiChu = ccChamCongNgayNhanVien.GhiChu;
            }
            return form;
        }

        #endregion

        #endregion

        #region TAM.NN
        public void BuildDanhSachNhanVienTrongCacChuyenHang(ChamCongHomNayForm form)
        {
            //var lstChamCongNhanVien = GetListChamCongNgayNhanVienByIdBangChamCong(form.Id);
            var totalItem = 0;
            var totalPage = 0;
            var lstChamCongNhanVien = GetListChamCongNgayNhanVienByIdBangChamCongOrderByTen(form.Id, form.PageIndex, form.ItemPerPage, ref totalItem, ref totalPage);
            form.TotalItem = totalItem;
            form.TotalPage = totalPage;

            foreach (var ccChamCongNgayNhanVien in lstChamCongNhanVien)
            {
                var nhanVienForm = new ChamCongHomNayForm();
                var objNhanVien = GetNhanVienById(ccChamCongNgayNhanVien.MaNhanVien);
                if (objNhanVien != null)
                {
                    nhanVienForm.NhanVien = BuildBaseNhanVienTrongChamCong(objNhanVien);
                    //Dữ liệu chấm công của ngày muốn chấm công
                    //nhanVienForm.NhanVien.ChamCongHomNay = GetChamCongNgayVaTangCaByThangNamVaIdNhanVienVaNgay(form.Thang, form.Nam,ccChamCongNgayNhanVien.MaNhanVien, form.Ngay);
                    //Build Dữ liệu chấm công của nhân viên trong một tháng
                    //BuildDuLieuChamCongTrongBaseNhanVienTrongChamCong(nhanVienForm.NhanVien, ccChamCongNgayNhanVien);
                    nhanVienForm.SoTienTrongMotNay = this.TongSoTienTrongMotNgayCuaNhanVien(ccChamCongNgayNhanVien.MaNhanVien,form.NgayChamCong!=null?form.NgayChamCong.Value.ToString("dd/MM/yyyy"):"").ToString("#,#0").Replace(",",".");
                    form.ListNhanVienTrongBangChamCong.Add(nhanVienForm);
                }
            }
        }

        public int LuuCacSoTienTrongChuyenHang(string GiaTri,int PhuXe,string LoaiXe,string SoLuongTaiXe,string IdNhanVien,int IdBangChamCong,string ngay)
        {
            try {
                //id=\"" + listSoKm[j].Id + "/" + listBuoi[K].Id + "\"
                string[] GiaTriVaId = GiaTri.Split(',');
                string[] IdNhanVienList = IdNhanVien.Split(',');
                
                using (var transation = new System.Transactions.TransactionScope())
                {

                    #region phụ xe
                    if (PhuXe == 1)
                    {
                        if ((GiaTriVaId.Length - 1) == 1)
                        {

                            string Id = GiaTriVaId[0].Split('=').First();
                            string value = GiaTriVaId[0].Split('=').Last();
                            string IdSoKm = Id.Split('/').First();
                            string IdBuoi = Id.Split('/').Last();
                            dm_PhuXe phuxe = _dBChamCong.dm_PhuXes.First();
                            dm_TienBoiDuong tienboiduong = _dBChamCong.dm_TienBoiDuongs.Where(p => p.IdBuoi == Convert.ToInt32(IdBuoi) && p.IdSoKm == Convert.ToInt32(IdSoKm)).First();
                            if (phuxe.SoLuongPhuXe <= tienboiduong.SoTien)
                            {
                                for (int i = 0; i < IdNhanVienList.Length - 1; i++)
                                {
                                    tb_TinhLuongThang_ThuongKmTrongThang TinhLuongThang = new tb_TinhLuongThang_ThuongKmTrongThang();
                                    TinhLuongThang.IdBangChamCong = IdBangChamCong;
                                    TinhLuongThang.MaNhanVien = Convert.ToInt32(IdNhanVienList[i]);
                                    TinhLuongThang.IdMaBuoi = Convert.ToInt32(IdBuoi);
                                    TinhLuongThang.IdMaSoKm = Convert.ToInt32(IdSoKm);
                                    TinhLuongThang.NgayLam = Common.DateTimeExtension.ConvertStringDDMMYYYYToYYYYMMDD(ngay);
                                    TinhLuongThang.IdPhuXe = phuxe.Id;
                                    TinhLuongThang.SoTienNhanDuocTrongChuyen = (Convert.ToInt32(value) * phuxe.PhanTramDiMotChuyen.Value * tienboiduong.SoTien.Value) / 100;
                                    _dBChamCong.tb_TinhLuongThang_ThuongKmTrongThangs.InsertOnSubmit(TinhLuongThang);
                                }
                                _dBChamCong.SubmitChanges();
                                transation.Complete();
                                return 1;
                            }
                            transation.Complete();
                            return 0;

                        }
                        else
                        {
                            transation.Complete();
                            return 0;
                        }
                    }
                    #endregion

                    #region Lưu nhiều tài xế đi chung một xe
                    dm_SoLuongTaiXeMotXe SoLuongTaiXeMotXe = _dBChamCong.dm_SoLuongTaiXeMotXes.SingleOrDefault(p => p.Id == Convert.ToInt32(SoLuongTaiXe));
                    dm_LoaiXe dmLoaiXe = _dBChamCong.dm_LoaiXes.SingleOrDefault(p => p.Id == Convert.ToInt32(LoaiXe));
                    if (SoLuongTaiXeMotXe.SoLuongTaiXe.Value >= 2)
                    {
                        if (IdNhanVienList.Length - 1 <= SoLuongTaiXeMotXe.SoLuongTaiXe.Value)
                        {
                            for (int k = 0; k < IdNhanVienList.Length - 1; k++)
                            {
                                for (int i = 0; i < GiaTriVaId.Length - 1; i++)
                                {
                                    tb_TinhLuongThang_ThuongKmTrongThang TinhLuongThang = new tb_TinhLuongThang_ThuongKmTrongThang();
                                    string Id = GiaTriVaId[0].Split('=').First();
                                    string value = GiaTriVaId[i].Split('=').Last();
                                    string IdSoKm = Id.Split('/').First();
                                    string IdBuoi = Id.Split('/').Last();
                                    dm_TienBoiDuong tienboiduong = _dBChamCong.dm_TienBoiDuongs.Where(p => p.IdBuoi == Convert.ToInt32(IdBuoi) && p.IdSoKm == Convert.ToInt32(IdSoKm)).First();
                                    TinhLuongThang.IdBangChamCong = IdBangChamCong;
                                    TinhLuongThang.MaNhanVien = Convert.ToInt32(IdNhanVienList[k]);
                                    TinhLuongThang.IdMaBuoi = Convert.ToInt32(IdBuoi);
                                    TinhLuongThang.IdMaSoKm = Convert.ToInt32(IdSoKm);
                                    TinhLuongThang.NgayLam = Common.DateTimeExtension.ConvertStringDDMMYYYYToYYYYMMDD(ngay);
                                    TinhLuongThang.SoChuyen = Convert.ToInt32(value);
                                    TinhLuongThang.SoTienNhanDuocTrongChuyen = (Convert.ToInt32(value) * tienboiduong.SoTien.Value * SoLuongTaiXeMotXe.PhanTramDuocTinh.Value * dmLoaiXe.PhaTramTinhChuyen.Value) / (100 * 100 * (SoLuongTaiXeMotXe.SoLuongTaiXe.Value));
                                    _dBChamCong.tb_TinhLuongThang_ThuongKmTrongThangs.InsertOnSubmit(TinhLuongThang);
                                  
                                }
                            }
                            _dBChamCong.SubmitChanges();
                            transation.Complete();
                            return 1;
                        }
                        else { return 2; }// sảy ra nếu số người được chọn hơn số lượng tài xế trên 1 xe VD:số người được chọn là 3 mà số lượng xe trên một tài xế là 2 vậy ko lưu được
                    }
                    #endregion

                    #region lưu tài xế bình thường
                    for (int k = 0; k < IdNhanVienList.Length - 1; k++)
                    {
                        for (int i = 0; i < GiaTriVaId.Length - 1; i++)
                        {
                            tb_TinhLuongThang_ThuongKmTrongThang TinhLuongThang = new tb_TinhLuongThang_ThuongKmTrongThang();
                            string Id = GiaTriVaId[i].Split('=').First();
                            string value = GiaTriVaId[i].Split('=').Last();
                            string IdSoKm = Id.Split('/').First();
                            string IdBuoi = Id.Split('/').Last();
                            dm_TienBoiDuong tienboiduong = _dBChamCong.dm_TienBoiDuongs.Where(p => p.IdBuoi == Convert.ToInt32(IdBuoi) && p.IdSoKm == Convert.ToInt32(IdSoKm)).First();
                            TinhLuongThang.IdBangChamCong = IdBangChamCong;
                            TinhLuongThang.MaNhanVien = Convert.ToInt32(IdNhanVienList[k]);
                            TinhLuongThang.IdMaBuoi = Convert.ToInt32(IdBuoi);
                            TinhLuongThang.IdMaSoKm = Convert.ToInt32(IdSoKm);
                            TinhLuongThang.NgayLam = Common.DateTimeExtension.ConvertStringDDMMYYYYToYYYYMMDD(ngay);
                            TinhLuongThang.SoChuyen = Convert.ToInt32(value);
                            TinhLuongThang.SoTienNhanDuocTrongChuyen = (Convert.ToInt32(value) * tienboiduong.SoTien.Value * dmLoaiXe.PhaTramTinhChuyen.Value) / 100;
                            _dBChamCong.tb_TinhLuongThang_ThuongKmTrongThangs.InsertOnSubmit(TinhLuongThang);
                        }
                    }
                    _dBChamCong.SubmitChanges();
                    transation.Complete();
                    return 1;
                    #endregion
                }
            }
            catch (Exception) { }
                return 0;

        }

        public int CapNhatCacSoTienTrongChuyenHang(string GiaTri, int PhuXe, string LoaiXe, string SoLuongTaiXe, string IdNhanVien, int IdBangChamCong, string ngay)
        {
            try
            {
                //id=\"" + listSoKm[j].Id + "/" + listBuoi[K].Id + "\"
                string[] GiaTriVaId = GiaTri.Split(',');
                string[] IdNhanVienList = IdNhanVien.Split(',');

                using (var transation = new System.Transactions.TransactionScope())
                {

                    #region phụ xe
                    if (PhuXe == 1)
                    {
                        if ((GiaTriVaId.Length - 1) == 1)
                        {

                            string Id = GiaTriVaId[0].Split('=').First();
                            string value = GiaTriVaId[0].Split('=').Last();
                            string IdSoKm = Id.Split('/').First();
                            string IdBuoi = Id.Split('/').Last();
                            dm_PhuXe phuxe = _dBChamCong.dm_PhuXes.First();
                            dm_TienBoiDuong tienboiduong = _dBChamCong.dm_TienBoiDuongs.Where(p => p.IdBuoi == Convert.ToInt32(IdBuoi) && p.IdSoKm == Convert.ToInt32(IdSoKm)).First();
                            if (phuxe.SoLuongPhuXe <= tienboiduong.SoTien)
                            {
                                for (int i = 0; i < IdNhanVienList.Length - 1; i++)
                                {
                                    IList<tb_TinhLuongThang_ThuongKmTrongThang> List = this.GetAllThuongKmTrongThang(Convert.ToInt32(IdNhanVienList[i]),ngay);
                                    _dBChamCong.tb_TinhLuongThang_ThuongKmTrongThangs.DeleteAllOnSubmit(List);
                                    tb_TinhLuongThang_ThuongKmTrongThang TinhLuongThang = new tb_TinhLuongThang_ThuongKmTrongThang();
                                    TinhLuongThang.IdBangChamCong = IdBangChamCong;
                                    TinhLuongThang.MaNhanVien = Convert.ToInt32(IdNhanVienList[i]);
                                    TinhLuongThang.IdMaBuoi = Convert.ToInt32(IdBuoi);
                                    TinhLuongThang.IdMaSoKm = Convert.ToInt32(IdSoKm);
                                    TinhLuongThang.NgayLam = Common.DateTimeExtension.ConvertStringDDMMYYYYToYYYYMMDD(ngay);
                                    TinhLuongThang.IdPhuXe = phuxe.Id;
                                    TinhLuongThang.SoTienNhanDuocTrongChuyen = (Convert.ToInt32(value) * phuxe.PhanTramDiMotChuyen.Value * tienboiduong.SoTien.Value) / 100;
                                    _dBChamCong.tb_TinhLuongThang_ThuongKmTrongThangs.InsertOnSubmit(TinhLuongThang);
                                }
                                _dBChamCong.SubmitChanges();
                                transation.Complete();
                                return 1;
                            }
                            transation.Complete();
                            return 0;

                        }
                        else
                        {
                            transation.Complete();
                            return 0;
                        }
                    }
                    #endregion

                    #region Lưu nhiều tài xế đi chung một xe
                    dm_SoLuongTaiXeMotXe SoLuongTaiXeMotXe = _dBChamCong.dm_SoLuongTaiXeMotXes.SingleOrDefault(p => p.Id == Convert.ToInt32(SoLuongTaiXe));
                    dm_LoaiXe dmLoaiXe = _dBChamCong.dm_LoaiXes.SingleOrDefault(p => p.Id == Convert.ToInt32(LoaiXe));
                    if (SoLuongTaiXeMotXe.SoLuongTaiXe.Value >= 2)
                    {
                        if (IdNhanVienList.Length - 1 <= SoLuongTaiXeMotXe.SoLuongTaiXe.Value)
                        {
                            for (int k = 0; k < IdNhanVienList.Length - 1; k++)
                            {
                                IList<tb_TinhLuongThang_ThuongKmTrongThang> List = this.GetAllThuongKmTrongThang(Convert.ToInt32(IdNhanVienList[k]), ngay);
                                _dBChamCong.tb_TinhLuongThang_ThuongKmTrongThangs.DeleteAllOnSubmit(List);
                                for (int i = 0; i < GiaTriVaId.Length - 1; i++)
                                {
                                    tb_TinhLuongThang_ThuongKmTrongThang TinhLuongThang = new tb_TinhLuongThang_ThuongKmTrongThang();
                                    string Id = GiaTriVaId[0].Split('=').First();
                                    string value = GiaTriVaId[i].Split('=').Last();
                                    string IdSoKm = Id.Split('/').First();
                                    string IdBuoi = Id.Split('/').Last();
                                    dm_TienBoiDuong tienboiduong = _dBChamCong.dm_TienBoiDuongs.Where(p => p.IdBuoi == Convert.ToInt32(IdBuoi) && p.IdSoKm == Convert.ToInt32(IdSoKm)).First();
                                    TinhLuongThang.IdBangChamCong = IdBangChamCong;
                                    TinhLuongThang.MaNhanVien = Convert.ToInt32(IdNhanVienList[k]);
                                    TinhLuongThang.IdMaBuoi = Convert.ToInt32(IdBuoi);
                                    TinhLuongThang.IdMaSoKm = Convert.ToInt32(IdSoKm);
                                    TinhLuongThang.NgayLam = Common.DateTimeExtension.ConvertStringDDMMYYYYToYYYYMMDD(ngay);
                                    TinhLuongThang.SoChuyen = Convert.ToInt32(value);
                                    TinhLuongThang.SoTienNhanDuocTrongChuyen = (Convert.ToInt32(value) * tienboiduong.SoTien.Value * SoLuongTaiXeMotXe.PhanTramDuocTinh.Value * dmLoaiXe.PhaTramTinhChuyen.Value) / (100 * 100 * (SoLuongTaiXeMotXe.SoLuongTaiXe.Value));
                                    _dBChamCong.tb_TinhLuongThang_ThuongKmTrongThangs.InsertOnSubmit(TinhLuongThang);
                                }
                            }
                            _dBChamCong.SubmitChanges();
                            transation.Complete();
                            return 1;
                        }
                        else { return 2; }// sảy ra nếu số người được chọn hơn số lượng tài xế trên 1 xe VD:số người được chọn là 3 mà số lượng xe trên một tài xế là 2 vậy ko lưu được
                    }
                    #endregion

                    #region lưu tài xế bình thường
                    for (int k = 0; k < IdNhanVienList.Length - 1; k++)
                    {
                        IList<tb_TinhLuongThang_ThuongKmTrongThang> List = this.GetAllThuongKmTrongThang(Convert.ToInt32(IdNhanVienList[k]), ngay);
                        _dBChamCong.tb_TinhLuongThang_ThuongKmTrongThangs.DeleteAllOnSubmit(List);
                        for (int i = 0; i < GiaTriVaId.Length - 1; i++)
                        {
                            tb_TinhLuongThang_ThuongKmTrongThang TinhLuongThang = new tb_TinhLuongThang_ThuongKmTrongThang();
                            string Id = GiaTriVaId[i].Split('=').First();
                            string value = GiaTriVaId[i].Split('=').Last();
                            string IdSoKm = Id.Split('/').First();
                            string IdBuoi = Id.Split('/').Last();
                            dm_TienBoiDuong tienboiduong = _dBChamCong.dm_TienBoiDuongs.Where(p => p.IdBuoi == Convert.ToInt32(IdBuoi) && p.IdSoKm == Convert.ToInt32(IdSoKm)).First();
                            TinhLuongThang.IdBangChamCong = IdBangChamCong;
                            TinhLuongThang.MaNhanVien = Convert.ToInt32(IdNhanVienList[k]);
                            TinhLuongThang.IdMaBuoi = Convert.ToInt32(IdBuoi);
                            TinhLuongThang.IdMaSoKm = Convert.ToInt32(IdSoKm);
                            TinhLuongThang.NgayLam = Common.DateTimeExtension.ConvertStringDDMMYYYYToYYYYMMDD(ngay);
                            TinhLuongThang.SoChuyen = Convert.ToInt32(value);
                            TinhLuongThang.SoTienNhanDuocTrongChuyen = (Convert.ToInt32(value) * tienboiduong.SoTien.Value * dmLoaiXe.PhaTramTinhChuyen.Value) / 100;
                            _dBChamCong.tb_TinhLuongThang_ThuongKmTrongThangs.InsertOnSubmit(TinhLuongThang);
                        }
                        
                    }
                    _dBChamCong.SubmitChanges();
                    transation.Complete();
                    return 1;
                    #endregion
                }
            }
            catch (Exception) { }
            return 0;
        }

        public decimal TongSoTienTrongMotNgayCuaNhanVien(int MaNhanVien, string NgayLam)
        {
            try
            {
                decimal sotien = this.GetAllThuongKmTrongThang(MaNhanVien, NgayLam).Sum(p => p.SoTienNhanDuocTrongChuyen.Value);
                return sotien;
            }
            catch (Exception) { return 0; }
            
        }

      
        #endregion
    }
}